线段树 (单点修改,区间查询)

https://www.luogu.com.cn/problem/P3374

单点修改,区间查询,上代码

 1 #include<bits/stdc++.h> 
 2 #define N 500005
 3 #define endl '\n' 
 4 #define _for(i,a,b) for(int i=a;i<b;i++)
 5 using namespace std;
 6 typedef long long ll; 
 7 ll a[N];
 8 struct Node{
 9     int L,R; ll Sum; 
10 }T[N*4];
11 void Build(int v,int L,int R){
12     T[v].L=L,T[v].R=R;
13     if( L==R ){
14         T[v].Sum=a[R];
15         return ;
16     }
17     int mid=(R+L)/2;
18     Build( v*2,L,mid );
19     Build( v*2+1,mid+1,R );
20     T[v].Sum= T[v*2].Sum + T[v*2+1].Sum;
21 }
22 void Add(int v,int pos,int k){
23     T[v].Sum+=k;
24     if( T[v].L==T[v].R ) return ;
25     if(pos<=T[v*2].R) Add( v*2,pos,k );
26     else Add( v*2+1,pos,k );
27 }
28 ll Search(int v,int L,int R){
29     if( T[v].L>=L && T[v].R<=R ){
30         return T[v].Sum;
31     }
32     if( T[v].L>R || T[v].R<L ) return 0;
33     ll res=0;
34     if( T[v*2].R>=L ) res+=Search(v*2,L,R);
35     if( T[v*2+1].L<=R ) res+=Search( v*2+1,L,R ); 
36     return res;
37 }
38 int main(){    
39     ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 
40     int n,m;   cin>>n>>m;
41     _for(i,1,n+1) cin>>a[i];
42     Build(1,1,n);
43     while(m--){
44         int b,c,d;
45         cin>>b>>c>>d;
46         if(b==1) Add(1,c,d); //a[c]+d;
47         else cout<<Search(1,c,d)<<endl; //
48     }
49     return 0;
50 } 

 

posted @ 2020-02-21 23:17  SunCY  阅读(226)  评论(0编辑  收藏  举报