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 }