1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int M=50000; struct ac { int sum,l,r,root,mid; }tree[M*4]; int num[M+5]; void build(int l,int r,int root) { tree[root].l=l; tree[root].r=r; if(tree[root].l==tree[root].r) { tree[root].sum=num[l]; return; } tree[root].mid=(l+r)/2; build(l,tree[root].mid,root<<1); build(tree[root].mid+1,r,root<<1|1); tree[root].sum=tree[root<<1].sum+tree[root<<1|1].sum; } void updata(int w,int v,int root) { if(tree[root].l==tree[root].r) { tree[root].sum=v; return; } if(w<=tree[root].mid) updata(w,v,root<<1); else updata(w,v,root<<1|1); tree[root].sum=tree[root<<1].sum+tree[root<<1|1].sum; } int query(int L,int R,int root) { if(tree[root].l>=L&&R>=tree[root].r) return tree[root].sum; int ans=0; if(L<=tree[root].mid) ans+=query(L,R,root<<1); if(R>tree[root].mid) ans+=query(L,R,root<<1|1); return ans; } int main() { int t,T=1,n; int a,b; char str[10]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&num[i]); build(1,n,1); printf("Case %d:\n",T++); while(1) { scanf("%s",str); if(strcmp(str,"End")==0) break; scanf("%d%d",&a,&b); if(strcmp(str,"Query")==0) { if(a>b) swap(a,b); int ans=query(a,b,1); printf("%d\n",ans); } if(strcmp(str,"Add")==0) { num[a]=num[a]+b; updata(a,num[a],1); } if(strcmp(str,"Sub")==0) { num[a]=num[a]-b; updata(a,num[a],1); } } } //cout << "Hello world!" << endl; return 0; }