#include <iostream>
using namespace std;
int sgTree[200000];
int sums,num,cnt;
int flag;
void createTree(int s,int e,int c)
{
if(s==e)
{
scanf("%d",&sgTree[c]);
return;
}
int mid=(s+e)/2;
createTree(s,mid,c*2);
createTree(mid+1,e,c*2+1);
sgTree[c]=sgTree[c*2]+sgTree[c*2+1];
// printf("%d %d\n",c,sgTree[c]);
}
void query(int s,int e,int c,int ts,int te)
{
if(s==ts&&e==te)
{
sums+=sgTree[c];
return;
}
int mid=(s+e)/2;
if(mid>=te) query(s,mid,c*2,ts,te);
else if(mid<ts) query(mid+1,e,c*2+1,ts,te);
else
{
query(s,mid,c*2,ts,mid);
query(mid+1,e,c*2+1,mid+1,te);
}
}
void update(int s,int e,int c)
{
if(s==e&&s==cnt)
{
if(flag) sgTree[c]+=num;
else if(sgTree[c]-num>=0) sgTree[c]-=num;
else sgTree[c]=0;
return;
}
int mid=(s+e)/2;
if(cnt<=mid) update(s,mid,c*2);
else update(mid+1,e,c*2+1);
sgTree[c]=sgTree[c*2]+sgTree[c*2+1];
// printf("%d %d\n",c,sgTree[c]);
}
int main()
{
// freopen("in.txt","r",stdin);
int t;
int n;
scanf("%d",&t);
int x=1;
while(t--)
{
scanf("%d ",&n);
createTree(1,n,1);
char cmd[10];
scanf(" %s",cmd);
printf("Case %d:\n",x++);
while(strcmp(cmd,"End"))
{
if(strcmp(cmd,"Query")==0)
{
int ts,te;
scanf("%d %d ",&ts,&te);
sums=0;
query(1,n,1,ts,te);
printf("%d\n",sums);
}
else
{
if(strcmp(cmd,"Add")==0)
flag=1;
else flag=0;
scanf("%d %d ",&cnt,&num);
update(1,n,1);
}
scanf(" %s",cmd);
}
}
return 0;
}
hdu 1166(线段树)
最新推荐文章于 2019-08-24 20:29:00 发布