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 }

 

转载于:https://www.cnblogs.com/helica/p/8596301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值