线段树题。
代码:
#include<iostream>
#include<fstream>
using namespace std;
struct e{
int l,r;
int color;
} tree[800001];
int n,m,t;
int v[31];
void build(int s,int t,int p){
tree[p].l=s;
tree[p].r=t;
tree[p].color=1;
if(t>s)
{
int mid=(s+t)>>1;
build(s,mid,p*2);
build(mid+1,t,p*2+1);
}
}
void insert(int l,int r,int color,int p){
if(l==tree[p].l&&r==tree[p].r)
{
tree[p].color=color;
return;
}
else
{
if(tree[p].color>0)
{
tree[2*p].color=tree[p].color;
tree[2*p+1].color=tree[p].color;
tree[p].color=0;
}
int mid=(tree[p].l+tree[p].r)>>1;
if(r<=mid) insert(l,r,color,2*p);
else
if(l>mid) insert(l,r,color,2*p+1);
else
{
insert(l,mid,color,2*p);
insert(mid+1,r,color,2*p+1);
}
}
}
void find(int l,int r,int p){
int i,j,k;
if(tree[p].color>0)
{
v[tree[p].color]=1;
return;
}
int mid=(tree[p].l+tree[p].r)>>1;
if(r<=mid) find(l,r,2*p);
else
if(l>mid) find(l,r,2*p+1);
else
{
find(l,mid,2*p);
find(mid+1,r,2*p+1);
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,tmp;
// cin>>n>>t>>m;
scanf("%d%d%d",&n,&t,&m);
build(1,n,1);
char c;
for(i=1;i<=m;i++)
{
cin>>c;
// scanf("%c",&c);
if(c=='C')
{
// cin>>j>>k>>s;
scanf("%d%d%d",&j,&k,&s);
if(j>k)
{
tmp=k;
k=j;
j=tmp;
}
insert(j,k,s,1);
}
else
{
// cin>>j>>k;
scanf("%d%d",&j,&k);
if(j>k)
{
tmp=k;
k=j;
j=tmp;
}
memset(v,0,sizeof(v));
find(j,k,1);
j=0;
for(k=1;k<=t;k++)
if(v[k]) j++;
cout<<j<<endl;
}
}
}
int main(){
read();
return 0;
}