[HDOJ] problem_1166:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 50005
int a[MAXN],sum[MAXN*4];
void build(int rt,int left,int right)
{
if (left==right)
{
sum[rt]=a[left];
return ;
}
int mid=(left+right)/2;
build(rt*2,left,mid);
build(rt*2+1,mid+1,right);
sum[rt]=sum[rt*2]+sum[rt*2+1];
}
void update(int rt,int left,int right,int i,int v)
{
if (left==i&&right==i)
{
sum[rt]+=v;
return ;
}
int mid=(left+right)/2;
if (i<=mid)
update(rt*2,left,mid,i,v);
else
update(rt*2+1,mid+1,right,i,v);
sum[rt]=sum[rt*2]+sum[rt*2+1];
}
int query(int rt,int left,int right,int i,int j)
{
int ans=0;
if (i<=left&&j>=right)
return sum[rt];
int mid=(left+right)/2;
if (i<=mid)
ans+=query(rt*2,left,mid,i,j);
if (j>mid)
ans+=query(rt*2+1,mid+1,right,i,j);
return ans;
}
int main()
{
int i,j,n,t,r,x,y;
char s[10];
while (scanf("%d",&t)!=-1)
{
for (r=1;r<=t;r++)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
printf("Case %d:\n",r);
build(1,1,n);
while (scanf("%s",s))
{
if (strcmp(s,"End")==0)
break;
scanf("%d %d",&x,&y);
getchar();
if (strcmp(s,"Query")==0)
{
printf("%d\n",query(1,1,n,x,y));
}
else if (strcmp(s,"Add")==0)
update(1,1,n,x,y);
else if (strcmp(s,"Sub")==0)
update(1,1,n,x,-y);
}
}
}
return 0;
}