线段树的基础题,之前写过,今天看了刘汝佳的《高级数据结构》又写了一次,对线段树的理解也更深了。
/*2012-08-07 15:45:14 Accepted 1166 343MS 736K 1598 B G++ Yu*/ #include<stdio.h> #include<string.h> #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 const int MAXN = 50050; int sum[MAXN << 2]; int n; void PushUp(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void build(int l, int r, int rt) { int m = l + r >> 1; if(l == r) { scanf("%d", &sum[rt]); return; } build(lson); build(rson); PushUp(rt); } void update(int p, int c, int l, int r, int rt) { int m = l + r >> 1; if(l == r) { sum[rt] += c; return; } if(p <= m) update(p, c, lson); else update(p, c, rson); PushUp(rt); } int query(int L, int R, int l, int r, int rt) { int m = l + r >> 1, res = 0; if(L <= l && r <= R) { return sum[rt]; } if(L <= m) res += query(L, R, lson); if(R > m) res += query(L, R, rson); return res; } void operation() { char op[5]; int a, b; while(true) { scanf("%s", op); if('E' == op[0]) break; else { scanf("%d%d", &a, &b); if('A' == op[0]) update(a, b, 1, n, 1); else if('S' == op[0]) update(a, -b, 1, n, 1); else printf("%d\n", query(a, b, 1, n, 1)); } } } int main() { int T, cas; scanf("%d", &T); for(cas = 1; cas <= T; cas ++) { scanf("%d", &n); build(1, n, 1); printf("Case %d:\n", cas); operation(); } return 0; }