地兵布阵
这是一个经典的树状数组求解问题。
树状数组一般适用于反复进行区间求和的问题,时间复杂度为N*(logN)。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
#include <string>
#include <ctime>
#include <queue>
using namespace std;
int t,n,tree[50005];
int i,j,a,b,x;
char str[10];
int lowbit(int i)
{
return i&(-i);
}
void update(int i,int x)
{
while(i<=n)
{
tree[i]=tree[i]+x;
i=i+lowbit(i);
}
}
int Query(int n)
{
int sum=0;
while(n>0)
{
sum=sum+tree[n];
n=n-lowbit(n);
}
return sum;
}
int main()
{
//freopen("lx.in","r",stdin);
//freopen("lx.out","w",stdout);
scanf("%d",&t);
for(i=1;i<=t;i++)
{
memset(tree,0,sizeof(tree));
cout<<"Case "<<i<<":"<<endl;
scanf("%d\n",&n);
for(j=1;j<=n;j++)
{
scanf("%d",&x);
update(j,x);
}
while(scanf("%s",str),strcmp(str,"End"))
{
scanf("%d%d\n",&a,&b);
if(str[0]=='Q') cout<<Query(b)-Query(a-1)<<endl;
else
{
if(str[0]=='A') update(a,b);
else update(a,-b);
}
}
}
return 0;
}