上次做这题用了线段树,这次写了树状数组。嗯,树状数组写起来简单,容易入手,很适用于比赛。
#include<stdio.h>
#include<string.h>
#define maxn 50010
int c[maxn],n,T;
int lowbit(int i){return i&(-i);}
int sum(int i)
{
int s=0;
while(i)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
void update(int i,int val)
{
while(i<=maxn)
{
c[i]+=val;
i+=lowbit(i);
}
}
int main()
{
scanf("%d",&T);
int u,v;
char s[10];
int t=1;
while(T--)
{
scanf("%d",&n);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&u);
update(i,u);
}
printf("Case %d:\n",t++);
for(;;)
{
scanf("%s",s);
if(s[0]=='E')break;
else if(s[0]=='Q')
{
scanf("%d%d",&u,&v);
printf("%d\n",sum(v)-sum(u-1));
}
else if(s[0]=='A')
{
scanf("%d%d",&u,&v);
update(u,v);
}
else if(s[0]=='S')
{
scanf("%d%d",&u,&v);
update(u,-v);
}
}
}
return 0;
}