单点更新,区间求和

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 const int N=1e5+5;
 6 int n,m;
 7 int sum[N<<2];
 8 
 9 void Update(int rt){
10     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
11 }
12 
13 void Build(int l,int r,int rt){
14     if(l==r) {scanf("%d",&sum[rt]);return;}
15     int mid=(l+r)>>1;
16     Build(l,mid,rt<<1);
17     Build(mid+1,r,rt<<1|1);
18     Update(rt);  //不要忘记往上更新
19 }
20 
21 void Add(int l,int r,int rt,int p,int v){
22     if(l==r) {sum[rt]+=v;return;}
23     int mid=(l+r)>>1;
24     if(p<=mid) Add(l,mid,rt<<1,p,v);
25     else Add(mid+1,r,rt<<1|1,p,v);
26     Update(rt);   //不要往上更新
27 }
28 
29 int query(int l,int r,int rt,int L,int R){
30     if(L<=l&&R>=r) return sum[rt];
31     int mid=(l+r)>>1;
32     int sum=0;   //递归
33     if(L<=mid) sum+=query(l,mid,rt<<1,L,R);
34     if(R>mid) sum+=query(mid+1,r,rt<<1|1,L,R);
35     return sum;
36 }
37 
38 int main()
39 {
40     scanf("%d",&n);
41     Build(1,n,1);
42     scanf("%d",&m);
43     while(m--){
44         int a,b,c;
45         scanf("%d%d%d",&a,&b,&c);
46         if(a==1) Add(1,n,1,b,c);
47         else if(a==2) printf("%d\n",query(1,n,1,b,c));
48     }
49     return 0;
50 }

 

posted @ 2019-06-06 21:31  厂长在线养猪  Views(179)  Comments(0Edit  收藏  举报