#include <iostream>
using namespace std;
int t,n,as[50005],cas=1,first,last,num,sum[50005<<2];
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void buildtree(int l ,int r,int rt)
{
if(l==r) {
sum[rt]=as[l];
return;
}
int m=(l+r)>>1;
buildtree(l,m,rt<<1);
buildtree(m+1,r,rt<<1|1);
pushup(rt);
}
void add(int k,int num,int l,int r,int rt)
{
if(l==r)
{sum[rt]+=num;
return;
}
int m=(l+r)>>1;
if(k<=m)
add(k,num,l,m,rt<<1);
else
add(k,num,m+1,r,rt<<1|1);
pushup(rt);
}
void sub(int k,int num,int l,int r,int rt)
{
if(l==r)
{sum[rt]-=num;
return;
}
int m=(l+r)>>1;
if(k<=m)
sub(k,num,l,m,rt<<1);
else
sub(k,num,m+1,r,rt<<1|1);
pushup(rt);
}
int ans(int a,int b,int rt,int l,int r)
{
if(a<=l&&r<=b)
{
return sum[rt];
}
int m=(l+r)>>1;
int all=0;
if(a<=m) all+=ans(a,b,rt<<1,l,m);
if(b>m) all+=ans(a,b,rt<<1|1,m+1,r);
return all;
}
int main()
{
string s;
cin>>t;
while(t--)
{
cout<<"Case "<<cas<<":"<<endl;
cas++;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>as[i];
}
buildtree(1,n,1);
while(cin>>s)
{
if(s=="End") break;
if(s=="Query")
{
cin>>first>>last;
cout<<ans(first,last,1,1,n)<<endl;
}
else if(s=="Add")
{
cin>>first>>num;
add(first,num,1,n,1);
}
else if(s=="Sub")
{
cin>>first>>num;
sub(first,num,1,n,1);
}
}
}
return 0;
}
hdu1166 敌兵布阵 线段树
最新推荐文章于 2020-08-03 23:18:48 发布