参考博客:https://blog.csdn.net/Small_Orange_glory/article/details/81290634
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 MAXN=50006;
int c[MAXN+1];
int lowbit(int x)
{
return x&(-x);
}
//取
int lowbits(int x)
{
return x&(-x);
}
int sum(int x)//此处x可以为0
{
int res=0;
while(x>0)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
int sums(int x)
{
int res=0;
while(x>0)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
void add(int x,int v)//x必须大于0
{
while(x<=MAXN)
{
c[x] +=v;
x+=lowbit(x);
}
}
void adds(int x,int v)
{
while(x<=MAXN)
{
c[x]+=v;
x+=lowbit(x);
}
}
int main()
{
int T,kase=1;
scanf("%d",&T);
while(T--)
{
printf("Case %d:\n",kase++);
int n;
scanf("%d",&n);
memset(c,0,sizeof(c));
for(int i=1; i<=n; i++)
{
int v;
scanf("%d",&v);
adds(i,v);
}
char str[10];
while(scanf("%s",str)==1)
{
if(str[0]=='E')
break;
else if(str[0]=='Q')
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d\n",sums(j)-sum(i-1));
}
else if(str[0]=='A')
{
int x,v;
scanf("%d%d",&x,&v);
adds(x,v);
}
else if(str[0]=='S')
{
int x,v;
scanf("%d%d",&x,&v);
adds(x,-v);
}
}
}
return 0;
}