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;
}
浙公网安备 33010602011771号