#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int l,t,o;
const int L=100005,T=35,O=100005;
int colour;
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
struct Node
{
int l,r;
int color;//位运算
bool cover;
}node[6*L];//完全二叉树节点数和叶子节点数的关系
void build(int index,int l,int r)
{
node[index].l=l;
node[index].r=r;
node[index].color|=1;
if(l==r)
{
return;
}
int mid=(l+r)/2;
build(index<<1,l,mid);
build((index<<1)+1,mid+1,r);
}
void insert(int index,int begin,int end,int value)
{
//if(node[index].l==node[index].r)
if(node[index].l==begin&&node[index].r==end)//是对段进行处理,不像之前每次都需要追溯到叶子节点。
{
node[index].color=(1<<(value-1));
node[index].cover=true;
return;
}
if(node[index].cover)//必须出这一句,因为如果某个非叶子节点是cover,但是此时更新他的叶子节点,然后递归回来更新父节点的时候即会得到错误的结果。
//本质上就是说之前因为省时间我们不需要更新到每个叶子节点,但是如果某个父节点是cover的,那涉及到它的子节点更新时候他的所有子节点都要更新。
{
node[index].cover=false;//少了这句不行。
node[index<<1].cover=true;
node[(index<<1)+1].cover=true;
node[index<<1].color=node[index].color;
node[(index<<1)+1].color=node[index].color;
}
int mid=(node[index].l+node[index].r)/2;
if(end<=mid)
{
insert(index<<1,begin,end,value);
}
else if(begin>mid)
{
insert((index<<1)+1,begin,end,value);
}
else
{
insert(index<<1,begin,mid,value);
insert((index<<1)+1,mid+1,end,value);
}
node[index].color=node[index*2].color | node[index*2+1].color;
}
void query(int index,int begin,int end)
{
if(node[index].cover||(begin==node[index].l&&end==node[index].r))//如果cover就不需要再追溯子节点。
{
colour|=node[index].color;
return;
}
int mid=(node[index].l+node[index].r)/2;
if(end<=mid)
{
query(index<<1,begin,end);
}
else if(begin>mid)
{
query((index<<1)+1,begin,end);
}
else
{
query((index<<1),begin,mid);
query((index<<1)+1,mid+1,end);
}
}
int main()
{
scanf("%d%d%d",&l,&t,&o);
char a[2];
int from,to,color;
build(1,1,l);
for(int i=1;i<=o;i++)
{
scanf("%s",&a);
scanf("%d%d",&from,&to);
if(from>to)
swap(from,to);
if(a[0]=='C')
{
scanf("%d",&color);
insert(1,from,to,color);
//func();
}
else
{
int ans=0;
colour=0;
query(1,from,to);
//func();
for(int i=0;i<t;i++)
{
if(colour&(1<<i))
ans++;
}
printf("%d\n",ans);
}
}
return 0;
}
poj 2777
最新推荐文章于 2020-09-29 16:53:08 发布