HDU1166-ZKW树

单点修改,区间求和

 1 //
 2 // Created by helica on 2018/3/18.
 3 //
 4 
 5 //zkw
 6 
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <cstdlib>
10 #include <algorithm>
11 
12 using namespace std;
13 
14 const int N = 50000 + 10;
15 
16 int s,t,M=1,n;
17 int T[N << 2];
18 
19 int query(int s, int t){
20     int ans = 0;
21     for (s = s+M-1,t=t+M+1; s^t^1 ; s>>=1,t>>=1) {
22         if(~s&1) ans += T[s^1];
23         if( t&1) ans += T[t^1];
24     }
25     return ans;
26 }
27 
28 void add(int x, int v){
29     T[M+x] += v;
30     for(int i=(M+x)>>1; i; i>>=1) T[i] = T[i<<1] + T[i<<1|1];
31 }
32 
33 void sub(int x, int v){
34     T[M+x] -= v;
35     for(int i=(M+x)>>1; i; i>>=1) T[i] = T[i<<1] + T[i<<1|1];
36 }
37 
38 int main(){
39     int k;
40     scanf("%d", &k);
41     for(int kase=1;kase<=k;kase++){
42         scanf("%d", &n);
43 
44         memset(T, 0, sizeof T);
45         for(M=1;M<n;M<<=1);
46 
47         for(int i=0,tmp;i<n;i++){
48             scanf("%d", &tmp);
49             add(i+1, tmp);
50         }
51         printf("Case %d:\n", kase);
52         char op[10];
53         while(scanf("%s", op)){
54             if (op[0] == 'E') break;
55             else if(op[0] == 'Q'){
56                 scanf("%d %d", &s, &t);
57                 printf("%d\n", query(s, t));
58             }else if(op[0] == 'A'){
59                 scanf("%d %d", &s, &t);
60                 add(s, t);
61             }else if(op[0] == 'S'){
62                 scanf("%d %d", &s, &t);
63                 sub(s, t);
64             }
65         }
66     }
67 }

 

posted @ 2018-03-18 17:21  Helica  阅读(252)  评论(0编辑  收藏  举报