HDU 1166 敌兵布阵(非结构体线段树-单点更新,区间求和)

题目传送门

#include<iostream>
#include<cstdio>
using namespace std;
int sum[400007];
int arr[400007];
void build(int rt,int l,int r) {
    if (l==r) { sum[rt]=arr[l];return; }
    int m=(l+r)>>1;
    build(rt<<1,l,m);
    build(rt<<1|1,m+1,r);
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int rt,int l,int r,int p,int v) {
    if (l==r) {sum[rt] += v;return;}
    int m=(l+r)>>1;
    if (p<=m) update(rt<<1,l,m,p,v);
    else 	  update(rt<<1|1,m+1,r,p,v);
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}

int query(int rt,int l,int r,int L,int R) {
    if (L<=l && r<= R) return sum[rt];
    int m=(l+r)>>1,ans=0;
    if (L<=m)   ans+=query(rt<<1,l,m,L,R);
    if (m+1<=R) ans+=query(rt<<1|1,m+1,r,L,R);
    return ans;
}
int main()
{
	// freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	int t,a,b;
	scanf("%d",&t);
	for(int j=1;j<=t;j++)
	{
		printf("Case %d:\n",j);
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&arr[i]);
		}
		build(1,1,n);
		char s[20];
		while(~scanf("%s",s))
		{
			if(s[0]=='E')
				break;
			else
				cin>>a>>b;
			if(s[0]=='Q')
			{
				printf("%d\n",query(1,1,n,a,b));
			}
			else if(s[0]=='A')
			{
				update(1,1,n,a,b);
			}
			else if(s[0]=='S')
			{
				update(1,1,n,a,-b);
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ytuyzh/article/details/89460553