线段树延迟更新的运用,这里用到二进制的方式保存状态,位运算向上更新状态
需要注意的是给出的a,b可能a>b
#include<stdio.h>
#include<string.h>
#define MAXN 100005
struct node
{
int l,r;
int c;
int rec;
}t[MAXN*4];
void construct(int l,int r,int p)
{
t[p].l=l,t[p].r=r;
t[p].c=t[p].rec=0;
if(l==r)
{
t[p].c=t[p].rec=1;
return ;
}
int m=(l+r)>>1;
construct(l,m,p<<1);
construct(m+1,r,p<<1|1);
t[p].rec=t[p<<1].rec|t[p<<1|1].rec;
}
void updata(int p)
{
t[p<<1].c=t[p].c;
t[p<<1].rec=t[p].rec;
t[p<<1|1].c=t[p].c;
t[p<<1|1].rec=t[p].rec;
t[p].c=0;
}
int query(int l,int r,int p)
{
if(t[p].l==l&&t[p].r==r)
{
return t[p].rec;
}
if(t[p].c)
updata(p);
int m=(t[p].l+t[p].r)>>1;
if(r<=m) return query(l,r,p<<1);
else if(l>m) return query(l,r,p<<1|1);
else return query(l,m,p<<1)|query(m+1,r,p<<1|1);
}
void modify(int l,int r,int v,int p)
{
if(t[p].l==l&&t[p].r==r)
{
int a=1<<(v-1);
t[p].c=v;
t[p].rec=a;
return ;
}
if(t[p].c)
updata(p);
int m=(t[p].l+t[p].r)>>1;
if(r<=m) modify(l,r,v,p<<1);
else if(l>m) modify(l,r,v,p<<1|1);
else modify(l,m,v,p<<1),modify(m+1,r,v,p<<1|1);
t[p].rec=t[p<<1].rec|t[p<<1|1].rec;
}
int main()
{
int n,t,m;
char op[3];
int l,r,c;
while(scanf("%d%d%d",&n,&t,&m)!=EOF)
{
construct(1,n,1);
while(m--)
{
scanf("%s%d%d",op,&l,&r);
if(l>r)
{
int temp=l;
l=r;
r=temp;
}
if(op[0]=='C')
{
scanf("%d",&c);
modify(l,r,c,1);
}
else
{
int a=query(l,r,1);
int ans=0;
while(a)
{
if(a&1) ans++;
a>>=1;
}
printf("%d\n",ans);
}
}
}
return 0;
}