线段树 (单点修改,区间查询)
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 }