树状数组
#include<bits/stdc++.h> using namespace std; long long data[50001],s[50001],T[50001]; long long lowbit(long long t) { return t&(-t); } long long sum(long long eend) { long long sum=0; while(eend>0) { sum+=T[eend]; eend-=lowbit(eend); } return sum; } void pplus(long long pos,long long num,long long ccount) { while(pos<=ccount) { T[pos]+=num; pos+=lowbit(pos); } } int main() { ios::sync_with_stdio(false); string str; int t,n,a,b; cin>>t; for(int i=1; i<=t; i++) { cin>>n; T[0]=s[0]=data[0]=0; for(int j=1; j<=n; j++) { cin>>data[j]; s[j]=s[j-1]+data[j]; T[j]=s[j]-s[j-lowbit(j)]; } cout<<"Case "<<i<<":"<<endl; while(cin>>str&&str!="End") { cin>>a>>b; if(str=="Query") cout<<sum(b)-sum(a)+data[a]<<endl; else if(str=="Add") pplus(a,b,n),data[a]+=b; else pplus(a,-b,n),data[a]-=b; } } }
#include<bits/stdc++.h> using namespace std; const int N= 50000; struct node { int l,r; long long sum; }; node tree[N*3]; void buildtree(int l,int r,int pos) { tree[pos].l=l; tree[pos].r=r; if(l==r) { cin>>tree[pos].sum; return ; } int mid=(l+r)>>1; buildtree(l,mid,pos*2); buildtree(mid+1,r,pos*2+1); tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum; } long long query(int l,int r,int pos) { if(l==tree[pos].l&&r==tree[pos].r) return tree[pos].sum; else if(r<=(tree[pos].l+tree[pos].r)/2) return query(l,r,pos<<1); else if(l>=(tree[pos].l+tree[pos].r)/2+1) return query(l,r,(pos<<1)+1); else return query(l,tree[pos*2].r,pos*2)+query(tree[pos*2+1].l,r,pos*2+1); } void update(int pos,int k,int add) { if(k>=tree[pos].l&&k<=tree[pos].r) { tree[pos].sum+=add; if(tree[pos].l==tree[pos].r) return ; update(pos*2,k,add); update(pos*2+1,k,add); } return ; } int main() { ios::sync_with_stdio(false); string str; int t,n,a,b; cin>>t; for(int i=1; i<=t; i++) { cin>>n; cout<<"Case "<<i<<":"<<endl; buildtree(1,n,1); while(cin>>str&&str!="End") { cin>>a>>b; if(str=="Query") cout<<query(a,b,1)<<endl; else if(str=="Add") update(1,a,b); else update(1,a,-b); } } return 0; }