这道题目,一看就是用树状数组写的嘿嘿.
不错,一次性就写成功了嘿嘿.
主要需要注意的点就是,询问的时候,由于是询问的区间,包括两边,所以你只能减去开头 往前面输一个 的营地的总和,,,
贴出代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int N;
int T;
int ar[50005];
int lowb(int t)
{
return t&(-t);
}
void add(int t,int v)
{
for(int i=t;i<50005;i+=lowb(i))
{
ar[i]+=v;
}
}
int sum(int t)
{
int s=0;
for( int i=t; i>0 ;i-=lowb(i))
{
s+=ar[i];
}
return s;
}
int main()
{
scanf("%d",&T);
int k=1;
int t1,t2;
while(T--)
{
int a;
char s[20];
scanf("%d",&N);
memset(ar,0,sizeof(ar));
for(int i=1;i<=N;i++)
{
scanf("%d",&a);
add(i,a);
}
printf("Case %d:\n",k++);
//for(i=1;i<=N;i++)
// {
// printf("%d___",ar[i]);
// }
// printf("\n");
while(scanf("%s",s)&&strcmp(s,"End"))
{
scanf("%d%d",&t1,&t2);
if(strcmp(s,"Sub")==0)
{
add(t1,-t2);
}
else if(strcmp(s,"Add")==0)
{
add(t1,t2);
}
else if(strcmp(s,"Query")==0)
{
int m1=sum(t1-1);
int m2=sum(t2);
// printf("%d@@@@%d\n",m1,m2);
printf("%d\n",m2-m1);
}
}
}
return 0;
}