59
//标准的树状数组模板
#include <stdio.h>
#include <string.h>
const int N=50010;
int c[N],n;
int lowbit(int x)
{
return x&(-x);
}
int sum(int i)
{
int sum=0;
while(i>0)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
void add(int i,int val)
{
while(i<=n)
{
c[i]+=val;
i+=lowbit(i);
}
}
void sub(int i,int val)
{
while(i<=n)
{
c[i]-=val;
i+=lowbit(i);
}
}
int main()
{
int t,cnt=1;
scanf("%d",&t);
while(t--)
{
int val;
scanf("%d",&n);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&val);
add(i,val);
}
char s[20];
printf("Case %d:\n",cnt++);
while(~scanf("%s",s))
{
int a1,a2;
if(strcmp(s,"End")==0)
break;
scanf("%d%d",&a1,&a2);
if(strcmp(s,"Query")==0)
{
printf("%d\n",sum(a2)-sum(a1-1));
}
if(strcmp(s,"Add")==0)
{
add(a1,a2);
}
if(strcmp(s,"Sub")==0)
{
sub(a1,a2); //这里直接套用add(a1,-a2)也可
}
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/a73265/article/details/47134747