/* 更新节点,区间求和 */ #include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; const int N = 50005; struct Tree{ int l, r, sum; }; Tree tree[3 * N]; int num[N]; inline void DFS_tree(int node, int l, int r){ tree[node].l = l; tree[node].r = r; tree[node].sum = 0; if(r == l){ tree[node].sum = num[r]; return ; } int mid = (r + l) / 2; DFS_tree(2 * node, l, mid); DFS_tree(2 * node + 1, mid + 1, r); tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum; } inline void Update(int node, int x, int value){ if(tree[node].l == tree[node].r){ tree[node].sum += value; return ; } int mid = (tree[node].l + tree[node].r) / 2; if(x <= mid) Update(node * 2, x, value); else Update(node * 2 + 1, x, value); tree[node].sum += value; } inline int Question(int node, int l, int r){ if(r == tree[node].r && l == tree[node].l){ return tree[node].sum; } int mid = (tree[node].r + tree[node].l) / 2; if(r <= mid) return Question(node * 2, l, r); else if(l > mid) return Question(node * 2 + 1, l, r); else return Question(node * 2, l, mid) + Question(node * 2 + 1, mid + 1, r); } int main(){ int t; string s; scanf("%d", &t); for(int i = 1; i <= t; i++){ int n; scanf("%d", &n); for(int j = 1; j <= n; j++) scanf("%d", &num[j]); printf("Case %d:/n", i); DFS_tree(1, 1, n); int x, y; char str[50]; while(true){ scanf("%s", str); s = str; if(s == "End") break; //cin >> x >> y; scanf("%d %d", &x, &y); if(s == "Query"){ printf("%d/n", Question(1, x, y)); } else if(s == "Sub"){ Update(1, x, -1 * y); } else if(s == "Add"){ Update(1, x, y); } } } return 0; }