题目大意:中文题啦。。
分析:线段树。单点更新。区间求和。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 50010; int n, sum[4*maxn]; void PushUP(int root) { sum[root] = sum[root*2+1]+sum[root*2+2]; } void Build(int root, int l, int r) { if(l == r) { scanf("%d", &sum[root]); return; } Build(root*2+1, l, (l+r)/2); Build(root*2+2, (l+r)/2+1, r); PushUP(root); } void update(int root, int l, int r, int p, int x) { if(l == r) { sum[root] += x; return; } int m = (l+r)/2; if(p <= m) update(root*2+1, l, m, p, x); else update(root*2+2, m+1, r, p, x); PushUP(root); } int query(int root, int l, int r, int L, int R) { if(L <= l && r <= R) { return sum[root]; } int m = (l+r)/2; int ans = 0; if(L <= m) ans += query(root*2+1, l, m, L, R); if(R > m) ans += query(root*2+2, m+1, r, L, R); return ans; } int main() { int T; scanf("%d", &T); for(int i = 1; i <= T; i++) { printf("Case %d:\n", i); memset(sum , 0, sizeof(sum)); scanf("%d", &n); Build(0, 1, n); char op[10]; while(scanf("%s", op)) { if(op[0] == 'E') break; int a, b; scanf("%d%d", &a, &b); if(op[0] == 'Q') printf("%d\n", query(0, 1, n, a, b)); else if(op[0] == 'A') update(0, 1, n, a, b); else update(0, 1, n, a, -b); } } return 0; }