题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1166
经典树状数组,将时间复杂度降为log n。
附代码.
注意本题目cin,cout会超时。建议使用scanf,printf。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int num[50050];
int n;
int updata(int i,int v)
{
while(i<=n)
{
num[i]+=v;
i+=i&-i;
}
return 0;
}
int read(int j)
{
int sum=0;
while(j>0)
{
sum+=num[j];
j-=j&-j;
}
return sum;
}
int main()
{
int t;
int i;
scanf("%d",&t);
int c=1;
while(t--)
{
printf("Case %d:\n",c);
c++;
scanf("%d",&n);
memset(num,0,sizeof(num));
for(i=1;i<=n;i++)
{
int temp;
scanf("%d",&temp);
updata(i,temp);
}
char order[20];
while(scanf("%s",&order))
{
if(order[0]=='E')
break;
int i,j;
if(order[0]=='Q')
{
scanf("%d%d",&i,&j);
printf("%d\n",(read(j)-read(i-1)));
}
else if(order[0]=='S')
{
scanf("%d%d",&i,&j);
updata(i,-j);
}
else if(order[0]=='A')
{
scanf("%d%d",&i,&j);
updata(i,j);
}
}
}
return 0;
}