题目大意:有两种操作
S x y:把第x个树改成y
M x y: 计算第x个数到第y个数之和
#include<cstdio>
#include<cstring>
#define maxn 8000000
int sum[maxn];
void build(int u, int l, int r) {
if(l == r) {
scanf("%d", &sum[u]);
return ;
}
int mid = (l + r) / 2;
build(2 * u, l, mid);
build(2 * u + 1, mid + 1, r);
sum[u] = sum[2 * u] + sum[2 * u + 1];
}
void modify(int u, int l, int r, int num, int pos) {
if(l == r) {
sum[u] = num;
return ;
}
int mid = (l + r) / 2;
if(pos <= mid)
modify(2*u,l,mid,num,pos);
else
modify(2*u+1,mid+1,r,num,pos);
sum[u] = sum[2 * u] + sum[2 * u + 1];
}
int query(int u, int l, int r, int L, int R) {
if(l >= L && r <= R)
return sum[u];
int mid = (l + r) / 2;
int ans = 0;
if(L <= mid)
ans += query(2*u,l,mid,L,R);
if(R > mid)
ans += query(2*u+1,mid+1,r,L,R);
return ans;
}
int main() {
int n, mark = 1, x, y, flag = 0;
char str[10];
while(scanf("%d", &n) == 1 && n) {
if(flag)
printf("\n");
else
flag = 1;
printf("Case %d:\n",mark++);
build(1,1,n);
while(scanf("%s", str)) {
if(strcmp(str,"END") == 0)
break;
scanf("%d%d", &x, &y);
if(str[0] == 'M')
printf("%d\n", query(1,1,n,x,y));
if(str[0] == 'S')
modify(1,1,n,y,x);
}
}
return 0;
}