#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100002;
int tree[maxn<<2],cov[maxn<<2];
void Pushup(int p)
{
tree[p]=tree[p<<1]|tree[p<<1|1];//通过或运算符来计数
}
void Pushdown(int p)
{
if(cov[p]){
cov[p<<1]=cov[p<<1|1]=cov[p];//当前颜色编号
tree[p<<1]=tree[p<<1|1]=1<<(cov[p]-1);//存的二进制数
cov[p]=0;
}
}
void Build(int l,int r,int p)
{
tree[p]=1;
cov[p]=1;//初始颜色全为1
if(l==r)
return;
int mid=(l+r)/2;
Build(l,mid,p<<1);
Build(mid+1,r,p<<1|1);
}
void Update(int l,int r,int x,int y,int p,int cr)
{
if(x<=l&&y>=r)
{
cov[p]=cr;
tree[p]=1<<(cr-1);
return;
}
Pushdown(p);
int mid=(l+r)/2;
if(x<=mid) Update(l,mid,x,y,p<<1,cr);
if(y>mid) Update(mid+1,r,x,y,p<<1|1,cr);
Pushup(p);
}
int Query(int l,int r,int x,int y,int p)
{
if(x<=l&&y>=r)
return tree[p];
Pushdown(p);
int mid=(l+r)/2;
if(y<=mid) return Query(l,mid,x,y,p<<1);
else if(x>mid) return Query(mid+1,r,x,y,p<<1|1);
else return Query(l,mid,x,y,p<<1)|Query(mid+1,r,x,y,p<<1|1);
}
int main()
{
int L,T,O;
scanf("%d%d%d",&L,&T,&O);
Build(1,L,1);
while(O--)
{
char s[2];
scanf("%s",s);
int a,b,c;
if(s[0]=='C')
{
scanf("%d%d%d",&a,&b,&c);
if(a>b) swap(a,b);
Update(1,L,a,b,1,c);
}
else{
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);
int ans=Query(1,L,a,b,1);
int sum=0;
while(ans)
{
if(ans&1)
sum++;
ans>>=1;
}
printf("%d\n",sum);
}
}
return 0;
}
poj2777(线段树lazy标记的使用)
最新推荐文章于 2020-03-07 09:30:38 发布