#include <cstdio>
#include <cstring>
using namespace std;
int T;
int N;
int a[50004];
struct node {
int l, r;
int value;
} tree[4 * 50001];
void build_tree(int l, int r, int u) {
tree[u].l = l;
tree[u].r = r;
if (l == r) {
tree[u].value = a[l];
return;
}
int mid = (l + r) >> 1;
build_tree(l, mid, u << 1);
build_tree(mid + 1, r, (u << 1) + 1);
tree[u].value = tree[u << 1].value + tree[(u << 1) + 1].value;
}
void Add(int i, int j, int u) {
tree[u].value += j;
if (tree[u].l == tree[u].r)
return;
if (tree[u << 1].r >= i)
Add(i, j, u << 1);
else
Add(i, j, (u << 1) + 1);
}
void Sub(int i, int j, int u) {
tree[u].value -= j;
if (tree[u].l == tree[u].r)
return;
if (tree[u << 1].r >= i)
Sub(i, j, u << 1);
else
Sub(i, j, (u << 1) + 1);
}
long long query(int l, int r, int u) {
if (l <= tree[u].l && r >= tree[u].r) {
return tree[u].value;
}
int mid = (tree[u].l + tree[u].r) >> 1;
long long ans = 0;
if (l <= mid) ans += query(l, r, u << 1);
if (r > mid) ans += query(l, r, (u << 1) + 1);
return ans;
}
int main() {
scanf_s("%d", &T);
int cot = 1;
while (T--) {
scanf_s("%d", &N);
for (int i = 1; i <= N; i++) {
scanf_s("%d", &a[i]);
}
build_tree(1, N, 1);
printf("Case %d:\n", cot);
char s[10];
while (scanf("%s", s) && s[0] != 'E') {
int i, j;
scanf_s("%d %d", &i, &j);
if (s[0] == 'Q')
printf("%lld\n", query(i, j, 1));
if (s[0] == 'A')
Add(i, j, 1);
if (s[0] == 'S')
Sub(i, j, 1);
}
return 0;
}
}
HDU-1166
最新推荐文章于 2024-08-09 20:36:57 发布