敌兵布阵
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cstring> #include<string> #include<bitset> #include<stack> using namespace std; typedef long long LL; #define MAXN 50009 #define N 25 #define INF 0x3f3f3f3f int t, n, a[MAXN]; struct node { int l, r, data; }T[MAXN * 4]; void build(int p, int l, int r) { T[p].l = l, T[p].r = r, T[p].data = 0; if (l == r) { T[p].data = a[l]; return; } int mid = (l + r) / 2; build(p * 2, l, mid); build(p * 2 + 1, mid + 1, r); T[p].data = T[p * 2].data + T[p * 2 + 1].data; } void insert(int p, int k, int v) { T[p].data += v; if (T[p].l == T[p].r && T[p].l == k) { return; } int mid = (T[p].l + T[p].r) / 2; if (k <= mid) insert(p * 2, k, v); else insert(p * 2 + 1, k, v); } int query(int p,int l, int r) { if (T[p].l >= l&&T[p].r <= r) { return T[p].data; } int mid = (T[p].l + T[p].r) / 2; if (r <= mid) return query(p * 2, l, r); else if (l > mid) return query(p * 2 + 1, l, r); else { return query(p * 2, l, r) + query(p * 2 + 1, l, r); } } int main() { scanf("%d", &t); int cas = 1; while (t--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, 1, n); char op[10]; int a, b, c; printf("Case %d:\n", cas++); while (scanf("%s", op), op[0] != 'E') { scanf("%d%d", &a, &b); if (op[0] == 'Q') { printf("%d\n", query(1, a, b)); } else if (op[0] == 'A') { insert(1, a, b); } else if (op[0] == 'S') { insert(1, a, -b); } } } }