1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
线段树单点更新区间查询
#include <cstdio> #include <cstring> #include <iostream> #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 using namespace std; const int maxn = 55555; int sum[maxn << 2]; void PushUP(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void build(int l, int r, int rt) { if (l == r) { scanf("%d", &sum[rt]); return; } int m = (l + r) >> 1; build(lson); build(rson); PushUP(rt); } int query(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) { return sum[rt]; } int m = (l + r) >> 1; int res = 0; if (L <= m) res += query(L, R, lson); if (R > m) res += query(L, R, rson); return res; } void Update(int p, int add, int l, int r, int rt) { if (l == r) { sum[rt] += add; return; } int m = (l + r) >> 1; if (p <= m) Update(p, add, lson); else Update(p, add, rson); PushUP(rt); } int main() { int T, a, b, cou = 0; char ch[10]; cin >> T; while (T--) { int N; scanf("%d", &N); build(1, N, 1); printf("Case %d:\n", ++cou); while (~scanf("%s", ch)) { if (ch[0] == 'E') break; scanf("%d%d", &a, &b); switch (ch[0]) { case 'Q': printf("%d\n", query(a, b, 1, N, 1)); break; case 'A': Update(a, b, 1, N, 1); break; case 'S': Update(a, -b, 1, N, 1); break; } } } return 0; }