线段树功能:update:单点增减 query(求之和)间求和
#include <cstdio>
#define lson l,m,rt << 1
#define rson m+ 1,r,rt << 1 | 1
const int maxn = 55555;
int sum[maxn << 2];
void PushUP(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void build(int l,int r,int rt)
{
if(l == r)
{
scanf("%d",&sum[rt]);
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
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) >> 1;
if(p <= m)
update(p,add,lson);
else
update(p,add,rson);
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) >> 1;
int ans = 0;
if(L <= m)
ans += query(L,R,lson);
if(R > m)
ans += query(L,R,rson);
return ans;
}
int main()
{
int T,n,pos = 0;
scanf("%d",&T);
while(T --)
{
printf("Case %d:\n",++ pos);
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;
}