HDU 1166 敌兵布阵(线段树)
#include<stdio.h>
#include<string.h>

int n;
int q;
int tot;

struct Tnode {
	int l;
	int r;
	int pl;
	int pr;
	int sum;
}node[200000];

char str[1000000];

int mid(int a,int b)
{
	return (a+b)/2;
}

int buildtree(int l,int r)
{
	int p=tot++;
	
	node[p].l=l;
	node[p].r=r;
	node[p].sum=0;
	
	if(l<r){
	node[p].pl=buildtree(l,mid(l,r));
	node[p].pr=buildtree(mid(l,r)+1,r);
	}

	return p;
}

void cleartree(int l,int r)
{
	tot=0;
	buildtree(l,r);
}

void add(int key, int val, int p)
{
	if (node[p].l>key || node[p].r<key)
		return;
	if (node[p].l<node[p].r) {
		add(key,val,node[p].pl);
		add(key,val,node[p].pr);
		node[p].sum=node[node[p].pl].sum+node[node[p].pr].sum;
	}
	else if(node[p].l==node[p].r && key==node[p].l){
		node[p].sum+=val;
	}
}

void sub(int key, int val, int p)
{
	if (node[p].l>key || node[p].r<key)
		return;
	if (node[p].l<node[p].r) {
		sub(key,val,node[p].pl);
		sub(key,val,node[p].pr);
		node[p].sum=node[node[p].pl].sum+node[node[p].pr].sum;
	}
	else if (node[p].l==key && node[p].l==node[p].r) {
		node[p].sum-=val;
	}
}

int query(int l,int r,int p)
{
	if (node[p].l>r || node[p].r<l)
		return 0;
	else if(node[p].l>=l && node[p].r<=r)
		return node[p].sum;
	else return query(l,r,node[p].pl) + query(l,r,node[p].pr);
}

int main()
{
	int ncase,a,b;
	scanf("%d",&ncase);
	for (int t=1;t<=ncase;t++) {
		scanf("%d",&n);
		
		cleartree(1, n);
		
		for (int i=1; i<=n; i++) {
			scanf("%d",&q);
			add(i, q, 0);
		}
		
		printf("Case %d:\n",t);
		
		while (1) {
			scanf("%s",str);
			if (strcmp(str, "Query")==0) {
				scanf("%d%d",&a,&b);
				printf("%d\n",query(a,b,0));
			}
			if (strcmp(str, "Add")==0) {
				scanf("%d%d",&a,&b);
				add(a, b, 0);
			}
			if (strcmp(str, "Sub")==0) {
				scanf("%d%d",&a,&b);
				sub(a, b, 0);
			}
			if (strcmp(str, "End")==0) {
				break;
			}
		}
	}
}
a
posted on 2011-07-12 22:47  Eucalyptus  阅读(139)  评论(0编辑  收藏  举报