#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int N=100005;
int n,k,m;
bitset<31>sum[N<<2],tag1[N<<2],tag2[N<<2];
void pushup(int k){sum[k]=sum[k<<1]|sum[k<<1|1];}
void lazy(int k,int l,int r,int v,int id){
tag1[k][id]=v,tag2[k][id]=1;
sum[k][id]=v;
}
void pushdown(int k,int l,int r,int mid,int id){
if(!tag2[k][id])return;
lazy(k<<1,l,mid,tag1[k][id],id);
lazy(k<<1|1,mid+1,r,tag1[k][id],id);
tag2[k][id]=0;
}
void pushdown(int k,int l,int r,int mid){
for(int i=1;i<=30;i++)pushdown(k,l,r,mid,i);
}
void modify(int k,int l,int r,int x,int y,int id){
if(x<=l&&r<=y){
for(int i=1;i<=30;i++)lazy(k,l,r,i==id,i);
return;
}
int mid=l+r>>1;
pushdown(k,l,r,mid);
if(x<=mid)modify(k<<1,l,mid,x,y,id);
if(mid<y)modify(k<<1|1,mid+1,r,x,y,id);
pushup(k);
}
bitset<31> query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return sum[k];
int mid=l+r>>1;
bitset<31>ret(0);
pushdown(k,l,r,mid);
if(x<=mid)ret|=query(k<<1,l,mid,x,y);
if(mid<y)ret|=query(k<<1|1,mid+1,r,x,y);
return ret;
}
char op[2];
int main(){
scanf("%d%d%d",&n,&k,&m);
lazy(1,1,n,1,1);
for(int a,b,c;m--;){
scanf("%s%d%d",op,&a,&b);
if(a>b)swap(a,b);
if(op[0]=='C'){
scanf("%d",&c);
modify(1,1,n,a,b,c);
}else{
printf("%d\n",query(1,1,n,a,b).count());
}
}
return 0;
}
或者指导下正确姿势?