这道题可用树状数组解,也可用线段树解
附上用树状数组解法:
另外再注意点,所有的输入输出都改为 scanf 和printf
不然会严重超时
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int c[50100];
int lowbit(int t)
{
return t&(-t);
}
void insert(int x,int maxn,int d)
{
while(x<=maxn)
{
c[x]+=d;
x+=lowbit(x);
}
}
long long getsum(int t)
{
long long s=0;
while(t>0)
{
s+=c[t];
t-=lowbit(t);
}
return s;
}
int main()
{
int t,n,test=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int temp;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
insert(i,n,temp);
}
char s[10];
int a,b;
scanf("%s",s);
printf("Case %d:\n",test++);
while(strcmp(s,"End")!=0)
{
scanf("%d%d",&a,&b);
if(strcmp(s,"Add")==0)
{
insert(a,n,b);
}
else if(strcmp(s,"Sub")==0)
{
insert(a,n,-b);
}
else if(strcmp(s,"Query")==0)
{
printf("%lld\n",getsum(b)-getsum(a-1));
}
scanf("%s",s);
}
}
return 0;
}