题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 Input 第一行一个整数T,表示有T组数据。 Output 对第i组数据,首先输出“Case i:”和回车, Sample Input
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End Sample Output
Case 1: 6 33 59 |
代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int N=50008;
int c[N];
/*int lowbit(int x)
{
return (x&(-x));
}*/
void add(int x,int y)
{
for(;x<=N;x+=(x&(-x)))
{
c[x]+=y;
}
}
int sum(int x)
{
int ans=0;
for(;x;x-=(x&(-x)))
{
ans+=c[x];
}
return ans;
}
int main()
{
int T,Case=1;
scanf("%d",&T);
while(T--)
{
memset(c,0,sizeof(c));
printf("Case %d:\n",Case++);
int n,val;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&val);
add(i,val);
}
char s1[10];
while(scanf("%s",s1)==1)
{
if(s1[0]=='E')
{
break;
}
else if(s1[0]=='A')
{
int x,v;
scanf("%d%d",&x,&v);
add(x,v);
}
else if(s1[0]=='S')
{
int x,v;
scanf("%d%d",&x,&v);
add(x,-v);
}
else
{
int x,v;
scanf("%d%d",&x,&v);
printf("%d\n",(sum(v)-sum(x-1)));
}
}
}
return 0;
}