树状数组裸题,区间查询,区间加,区间减
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<map>
#include<vector>
using namespace std;
const int maxn = 50010;
int T,n,a[maxn],b[maxn];
string cmd;
int lowbit(int x)
{
return x&(-x);
}
void add(int i,int x)
{
while(i<=n)
{
b[i]+=x;
i+=lowbit(i);
}
}
int sum(int x)
{
int sum=0;
while(x)
{
sum+=b[x];
x-=lowbit(x);
}
return sum;
}
void reduce(int i,int x)
{
while(i<=n)
{
b[i]-=x;
i+=lowbit(i);
}
}
int main()
{
scanf("%d",&T);
int kas=1;
while(T--)
{
printf("Case %d:\n",kas++);
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
add(i,a[i]);
}
while(cin>>cmd)
{
int a,b;
if(cmd=="End")
break;
if(cmd=="Query")
{
scanf("%d %d",&a,&b);
printf("%d\n",sum(b)-sum(a-1));
}
else if(cmd=="Add")
{
scanf("%d %d",&a,&b);
add(a,b);
}
else if(cmd=="Sub")
{
scanf("%d %d",&a,&b);
reduce(a,b);
}
}
}
return 0;
}