hdu 1166(线段树)

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值