NYOJ 123士兵杀敌(四)(树状数组)(插线问点)

和树状数组插点求线刚好相反,插线求点看上去似乎是插点求线的逆操作,插点求线操作是:插点时更新后方+lowbit位置,求线时统计前方-lowbit 的和,插线求点反而是插线时修改前方lowbit位置值,求点时统计后方lowbit的和,插点求线代码见士兵杀敌(二),以下是插线求点的方法:

 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 }
View Code

 


           

原文地址:https://www.cnblogs.com/qiu520/p/3199271.html