线段树基础题:
1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 200000+100 4 5 int T, N, D, tree[MAXN], num; 6 char s[10]; 7 8 void updata(int cur, int j) 9 { 10 for(int i = D+cur; i^1; i >>= 1) 11 tree[i] += j; 12 } 13 14 int query(int x, int y) 15 { 16 int i = D+x-1, j = D+y+1,ans = 0; 17 for(; i^j^1; i >>= 1, j>>=1) 18 { 19 if(~i&1) 20 ans += tree[i^1]; 21 if(j&1) 22 ans += tree[j^1]; 23 } 24 return ans; 25 } 26 27 int main() 28 { 29 while(~scanf("%d",&T)) 30 { 31 num = 1; 32 while(T --) 33 { 34 printf("Case %d:\n",num++); 35 scanf("%d",&N); 36 if(N == 0) break; 37 memset(tree, 0, sizeof(tree)); 38 for(D = 1; D <= N + 2; D <<= 1); 39 for(int i = 1; i <= N; i ++) 40 scanf("%d",&tree[D+i]); 41 for(int i = D-1; i > 0; i --) 42 { 43 tree[i] = tree[i<<1] + tree[i<<1|1]; 44 } 45 for(;;) 46 { 47 scanf("%s",s); 48 int a, b; 49 if(s[0] == 'E') break; 50 if(s[0] == 'A') 51 { 52 scanf("%d%d",&a,&b); 53 updata(a,b); 54 } 55 if(s[0] == 'S') 56 { 57 scanf("%d%d",&a,&b); 58 updata(a,-b); 59 } 60 if(s[0] == 'Q') 61 { 62 scanf("%d%d",&a, &b); 63 printf("%d\n",query(a,b)); 64 } 65 } 66 } 67 } 68 return 0; 69 }