poj 2777

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n,m,c;

struct e{
	int l,r;
	int state;
	bool id;
};

e tree[300001];

void build(int s,int t,int p){
	int i,j,k;
	tree[p].l=s;
	tree[p].r=t;
	
	if(s==t) return;
	k=(s+t)>>1;
	build(s,k,p*2);
	build(k+1,t,2*p+1);
}


void update(int s,int t,int p,int value){
	int i,j,k;	
	if(s<=tree[p].l&&tree[p].r<=t)
	{
		tree[p].id=1;
		tree[p].state=1<<(value-1);

		return;
	}
	if(tree[p].id)
	{
		tree[p].id=0;
		tree[p*2].state=tree[2*p+1].state=tree[p].state;
		tree[p*2].id=tree[p*2+1].id=1;
	}

	if(t<=tree[p*2].r) update(s,t,p*2,value);
	else
		if(s>=tree[2*p+1].l) update(s,t,2*p+1,value);
		else
		{
			update(s,t,p*2,value);
			update(s,t,p*2+1,value);
		}
	tree[p].state=tree[p*2].state|tree[p*2+1].state;
	if(tree[p*2].id&&tree[p*2+1].id&&tree[p*2].state==tree[2*p+1].state)
		tree[p].id=1;
}

int find(int s,int t ,int p){

	if(s<=tree[p].l&&t>=tree[p].r)
		return tree[p].state;
	if(tree[p].id) return tree[p].state;
	if(t<=tree[p*2].r) return find(s,t,p*2);
	else
		if(s>=tree[2*p+1].l) return find(s,t,2*p+1);
		else
		{
			int i=find(s,t,p*2);
			i|=find(s,t,p*2+1);
			return i;
		}
}
int color;

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t,p;
//	cin>>n>>color>>m;
	scanf("%d%d%d",&n,&color,&m);
	build(1,n,1);
	tree[1].state=1;
	tree[1].id=1;
	char c;
	for(i=1;i<=m;i++)
	{
		getchar();
		//cin>>c;
		scanf("%c",&c);
		if(c=='C')
		{
			//cin>>s>>t>>p;
			scanf("%d%d%d",&s,&t,&p);
			if(s>t) swap(s,t);
			update(s,t,1,p);
		}
		else
		{
			//cin>>s>>t;
			scanf("%d%d",&s,&t);
			if(s>t) swap(s,t);
			j=find(s,t,1);
			k=0;
			for(s=0;s<color;s++)
				if(j&(1<<s)) k++;
			cout<<k<<endl;
		}
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-05-16 10:50  宇宙吾心  阅读(556)  评论(0)    收藏  举报

导航