线段树第一步~
是找了别人的模板~~
看明天自己能不能写一遍看看~
//by Goner
#include <stdio.h>
const int maxn = 50010;
int sum[maxn * 4];
void PushUP(int rt) {
sum[rt] = sum[rt * 2] + sum[rt * 2 + 1];
}
void build(int l, int r, int rt) {
if (l == r) {
scanf("%d", &sum[rt]);
return ;
}
int m = (l + r) / 2;
build(l, m, rt * 2);
build(m + 1, r, rt * 2 + 1);
PushUP(rt);
}
void update(int p, int add, int l, int r, int rt) {
if (l == r) {
sum[rt] += add;
return ;
}
int m = (l + r) / 2;
if (p <= m) update(p, add, l, m, rt * 2);
else update(p, add, m + 1, r, rt * 2 + 1);
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) / 2;
int ret = 0;
if (L <= m) ret += query(L , R , l, m, rt * 2);
if (R > m) ret += query(L , R , m + 1, r, rt * 2 + 1);
return ret;
}
int main() {
int T , n;
scanf("%d",&T);
for (int cas = 1 ; cas <= T ; cas ++) {
printf("Case %d:\n",cas);
scanf("%d",&n);
build(1 , n , 1);
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(a , b , 1 , n , 1));
else if (op[0] == 'S') update(a , -b , 1 , n , 1);
else update(a , b , 1 , n , 1);
}
}
return 0;
}