和树状数组插点求线刚好相反,插线求点看上去似乎是插点求线的逆操作,插点求线操作是:插点时更新后方+lowbit位置,求线时统计前方-lowbit 的和,插线求点反而是插线时修改前方lowbit位置值,求点时统计后方lowbit的和,插点求线代码见士兵杀敌(二),以下是插线求点的方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 const int M=1000010; 4 int data[M]; 5 int Max; 6 inline int LowBit(int n) 7 { 8 return n&(-n); 9 } 10 void Plus(int n,int value) //前n项每项增加value 11 { 12 while(n>0) 13 { 14 data[n]+=value; 15 n-=LowBit(n); 16 } 17 } 18 int Get(int n) //获取每个位置的值 19 { 20 int sum=0; 21 while(n<=Max) 22 { 23 sum+=data[n]; 24 n+=LowBit(n); 25 } 26 return sum; 27 } 28 int main() 29 { 30 int n,a,b,v; 31 char s[9]; 32 scanf("%d%d",&n,&Max); 33 while(n--) 34 { 35 scanf("%s",s); 36 if(s[0]=='A') 37 { 38 scanf("%d%d%d",&a,&b,&v); 39 Plus(a-1,-v);//关键 40 Plus(b,v);//关键 41 } 42 else 43 { 44 scanf("%d",&a); 45 printf("%d ",Get(a)); 46 } 47 } 48 return 0; 49 }