http://acm.hdu.edu.cn/showproblem.php?pid=1166
1 #include <cstdio>
2
3 #define lson l , m , rt << 1
4 #define rson m + 1 , r , rt << 1 | 1
5 const int maxn = 55555;
6 int sum[maxn<<2];
7 void PushUP(int rt) {
8 sum[rt] = sum[rt<<1] + sum[rt<<1|1];
9 }
10 void build(int l,int r,int rt) {
11 if (l == r) {
12 scanf("%d",&sum[rt]);
13 return ;
14 }
15 int m = (l + r) >> 1;
16 build(lson);
17 build(rson);
18 PushUP(rt);
19 }
20 void update(int p,int add,int l,int r,int rt) {
21 if (l == r) {
22 sum[rt] += add;
23 return ;
24 }
25 int m = (l + r) >> 1;
26 if (p <= m) update(p , add , lson);
27 else update(p , add , rson);
28 PushUP(rt);
29 }
30 int query(int L,int R,int l,int r,int rt) {
31 if (L <= l && r <= R) {
32 return sum[rt];
33 }
34 int m = (l + r) >> 1;
35 int ret = 0;
36 if (L <= m) ret += query(L , R , lson);
37 if (R > m) ret += query(L , R , rson);
38 return ret;
39 }
40 int main() {
41 int T , n;
42 scanf("%d",&T);
43 for (int cas = 1 ; cas <= T ; cas ++) {
44 printf("Case %d:\n",cas);
45 scanf("%d",&n);
46 build(1 , n , 1);
47 char op[10];
48 while (scanf("%s",op)) {
49 if (op[0] == 'E') break;
50 int a , b;
51 scanf("%d%d",&a,&b);
52 if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1));
53 else if (op[0] == 'S') update(a , -b , 1 , n , 1);
54 else update(a , b , 1 , n , 1);
55 }
56 }
57 return 0;
58 }