题目解析:
这个题目非常的简单,就是一个简单的模板题目,有两种做法,一种是用树状数组,另外一种就是大家所熟知的线段树,对于这个题目我选则用树状数组来解决,update是更新函数,sum是求和函数,看下面的代码大家就会明白;
代码:
#include
using namespace std;
const int maxn = 1e6+100;
int C[maxn];
char s[100];
int n;
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int ret = 0;
while(x>0)
{
ret+=C[x];
x-=lowbit(x);
}
return ret;
}
void update(int x,int val)
{
while(x<=n)
{
C[x]+=val;
x+=lowbit(x);
}
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
int cas=1;
scanf("%d",&T);
while(T--)
{
memset(C,0,sizeof(C));
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int val;
scanf("%d",&val);
update(i,val);
}
int a,b;
printf("Case %d:\n",cas++);
while(scanf("%s", s))
{
if(s[0]=='E')
break;
scanf("%d%d",&a,&b);
if(s[0]=='Q')
printf("%d\n",sum(b)-sum(a-1));
else if(s[0]=='A')
update(a,b);
else if(s[0]=='S')
update(a,-b);
}
}
return 0;
}