题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
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
Case 1: 6 33 59
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[50000+10];
int c[50000+10],n;
int lowbit(int k)
{
return k&(-k);
}
void add(int num,int k)
{
while (k<=n)
{
c[k]+=num;
k+=lowbit(k);
}
}
int sum(int k)//求出1-k之间的和
{
int s=0;
while (k)
{
s+=c[k];
k-=lowbit(k);
}
return s;
}
int main()
{
int t;
char ch[30];
int flag=1;
scanf("%d",&t);
while (t--)
{
printf ("Case %d:\n",flag++);
memset(c,0,sizeof(c));
int x,y;
scanf("%d",&n);
for (int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
add(a[i],i);
}
while (~scanf("%s",ch))
{
if (strcmp(ch,"Query")==0)
{
scanf("%d%d",&x,&y);
int ans=sum(y)-sum(x-1);
printf ("%d\n",ans);
}
else if (strcmp(ch,"Add")==0)
{
scanf("%d%d",&x,&y);
add(y,x);
}
else if (strcmp(ch,"Sub")==0)
{
scanf("%d%d",&x,&y);
add(-y,x);
}
else
break;
}
}
return 0;
}
原文:http://blog.csdn.net/qiqi_skystar/article/details/50609226