链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
代码

1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 50000*4+5 4 struct node { 5 int l,r,val; 6 }tr[maxn]; 7 void pushup(int rt) 8 { 9 tr[rt].val = tr[rt*2].val+tr[rt*2+1].val; 10 return; 11 } 12 void build(int l,int r,int rt) 13 { 14 tr[rt].l = l; 15 tr[rt].r = r; 16 if(r == l) 17 { 18 scanf("%d",&tr[rt].val); 19 return; 20 } 21 int m; 22 m = (r+l)/2; 23 build(l,m,rt*2); 24 build(m+1,r,rt*2+1); 25 pushup(rt); 26 } 27 void update(int target,int val,int rt) 28 { 29 int m; 30 if(tr[rt].l == tr[rt].r){ 31 tr[rt].val += val; 32 return; 33 } 34 m = (tr[rt].l+tr[rt].r)/2; 35 if(target > m) 36 update(target,val,rt*2+1); 37 else 38 update(target,val,rt*2); 39 pushup(rt); 40 return; 41 } 42 int ask(int l,int r,int rt) 43 { 44 if(tr[rt].l == l&& r == tr[rt].r) 45 return tr[rt].val; 46 int m; 47 m = (tr[rt].l+tr[rt].r)/2; 48 if(l > m) 49 return ask(l,r,rt*2+1); 50 else if(r <= m) 51 return ask(l,r,rt*2); 52 else 53 return ask(l,m,rt*2)+ask(m+1,r,rt*2+1); 54 } 55 int main() 56 { 57 int t; 58 scanf("%d",&t); 59 int cas = 0; 60 while(t--) 61 { 62 cas++; 63 printf("Case %d:\n",cas); 64 int n,i,j,k; 65 char order[20]; 66 scanf("%d",&n); 67 build(1,n,1); 68 while(~scanf("%s",order)) 69 { 70 if(order[0] == 'E') 71 break; 72 scanf("%d %d",&i,&j); 73 if(order[0] == 'A') 74 update(i,j,1); 75 else if(order[0] == 'S') 76 update(i,-j,1); 77 else 78 printf("%d\n",ask(i,j,1)); 79 } 80 } 81 }