P3373 树状数组1(树状数组//改点求段)

改点求段

 1 #include<iostream>
 2 using namespace std;
 3 const int N=5e5+100;
 4 int n,m;
 5 int a[N];
 6 int c[N];
 7 int lowbit(int x)
 8 {
 9     return x&(-x);
10 }
11 void add(int x,int y)//将第x个数加上y
12 {
13     a[x]+=y;
14     for(int i=x;i<=n;i+=lowbit(i))
15     {
16         c[i]+=y;
17     }
18 }
19 int getsum(int x)//求[1,x]的和
20 {
21     int ans=0;
22     for(int i=x;i>0;i-=lowbit(i))
23     {
24         ans+=c[i];
25     }
26     return ans;
27 }
28 int main(void)
29 {
30     cin>>n>>m;
31     for(int i=1;i<=n;i++)
32     {
33         cin>>a[i];
34         add(i,a[i]);//给c数组赋初值
35     }
36     for(int i=1;i<=m;i++)
37     {
38         int t,x,y;
39         cin>>t>>x>>y;
40         if(t==1)
41         {
42             add(x,y);
43         }
44         else if(t==2)
45         {
46             int t1=getsum(x-1);
47             int t2=getsum(y);
48             cout<<t2-t1<<endl;
49         }
50     }
51     return 0;
52 }

 

posted on 2020-02-03 19:53  greenofyu  阅读(142)  评论(0编辑  收藏  举报