不多说,去年就做过的题,复习线段树顺手用树状数组搞一发
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
#define maxn 55000
using namespace std;
int a[maxn],n;
int bit(int k)
{
return k&(-k);//二进制
}
int sum(int k)
{
int ans=0;
while(k>0)
{
ans+=a[k];
k-=bit(k);
}
return ans;//计算区间和
}
void up(int x,int k)
{
while(x<=n)
{
a[x]+=k;
x+=bit(x);
}
}
int main()
{
int t;
int p,q;
char s[1001];
scanf("%d",&t);
for(int k=1;k<=t;k++)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%d",&p);
up(i,p);
}
printf("Case %d:\n",k);
while(scanf("%s",&s)!=EOF)
{
if(s[0]=='E')
{
break;
}
if(s[0]=='Q')
{
scanf("%d%d",&p,&q);
printf("%d\n",sum(q)-sum(p-1));
//cout<<sum(q)<<" "<<sum(p-1)<<endl;
}
if(s[0]=='A')
{
scanf("%d%d",&p,&q);
up(p,q);
}
if(s[0]=='S')
{
scanf("%d%d",&p,&q);
up(p,-q);
}
}
}
return 0;
}