线段树基础题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define maxn 50010
int num[maxn],flag,ans;
struct
{
int left,right,mid,cnt;
}tr[maxn<<2];
void build(int s,int t,int k)
{
if(s==t)
{
tr[k].left=tr[k].right=s;
tr[k].cnt=num[s];
return;
}
tr[k].mid=(s+t)/2;
tr[k].left=s;
tr[k].right=t;
build(s,tr[k].mid,k*2);
build(tr[k].mid+1,t,k*2+1);
tr[k].cnt=tr[k*2].cnt+tr[k*2+1].cnt;
}
void query(int s,int t,int k)
{
if(s==tr[k].left&&tr[k].right==t)
ans+=tr[k].cnt;
else
{
if(tr[k].mid>=t)
query(s,t,k*2);
else if(tr[k].mid<s)
query(s,t,k*2+1);
else
{
query(s,tr[k].mid,k*2);
query(tr[k].mid+1,t,k*2+1);
}
}
}
void update(int k,int n,int pos)
{
if(tr[k].left==pos&&pos==tr[k].right)
{
tr[k].cnt+=n;
return;
}
if(pos<=tr[k].mid)
update(k*2,n,pos);
else
update(k*2+1,n,pos);
tr[k].cnt=tr[k*2].cnt+tr[k*2+1].cnt;
}
int main()
{
int t,n,i,a,b,cnt=0;
char s[10];
// freopen("test.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
printf("Case %d:\n",++cnt);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
build(1,n,1);
while(scanf("%s",s)&&s[0]!='E')
{
scanf("%d%d",&a,&b);
if(s[0]=='Q')
{
ans=0;
query(a,b,1);
printf("%d\n",ans);
}
else
{
if(s[0]=='A')
flag=1;
else
flag=-1;
update(1,flag*b,a);
}
}
}
return 0;
}