代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
int l,r,cnt[34],lazyc;
bool hl;
}tree[300005];
int L,T,Q;
void bt(int i,int l,int r)
{
tree[i].l=l;tree[i].r=r;
tree[i].cnt[1]=r-l+1;
if(l!=r)
{
bt(i*2,l,(l+r)/2);
bt(i*2+1,(l+r)/2+1,r);
}
}
void update(int nod)
{
if(tree[nod].l==tree[nod].r)return;
for(int i = 1;i <=T;i++)tree[nod].cnt[i]=tree[nod*2].cnt[i]+tree[nod*2+1].cnt[i];
tree[nod].hl=false;
tree[nod].lazyc=0;
}
void pushdown(int nod)
{
if(!tree[nod].hl)return;
if(tree[nod].l==tree[nod].r)return;
tree[nod*2].lazyc=tree[nod*2+1].lazyc=tree[nod].lazyc;
tree[nod*2].hl=tree[nod*2+1].hl=tree[nod].hl;
for(int i = 1;i <=T;i++)
{
tree[nod*2].cnt[i]=0;
tree[nod*2+1].cnt[i]=0;
}
tree[nod*2].cnt[tree[nod].lazyc]=tree[nod*2].r-tree[nod*2].l+1;
tree[nod*2+1].cnt[tree[nod].lazyc]=tree[nod*2+1].r-tree[nod*2+1].l+1;
tree[nod].hl=false;tree[nod].lazyc=0;
}
void change(int nod,int l,int r,int k)
{
if(tree[nod].l==l&&tree[nod].r==r)
{
tree[nod].lazyc=k;tree[nod].hl=true;
for(int i = 1;i <=T;i++)tree[nod].cnt[i]=0;
tree[nod].cnt[k]=r-l+1;
return;
}
pushdown(nod);
if(r<=tree[nod*2].r)
{
change(nod*2,l,r,k);
return;
}
if(l>=tree[nod*2+1].l)
{
change(nod*2+1,l,r,k);
return;
}
change(nod*2,l,tree[nod*2].r,k);
change(nod*2+1,tree[nod*2+1].l,r,k);
update(nod);
}
int find(int nod,int l,int r)
{
if(tree[nod].l==l&&tree[nod].r==r)
{
int ansss=0;
for(int i = 1;i <=T;i++) if(tree[nod].cnt[i]) ansss|=(1<<i);
return ansss;
}
pushdown(nod);
if(r<=tree[nod*2].r) return find(nod*2,l,r);
if(l>=tree[nod*2+1].l) return find(nod*2+1,l,r);
return (find(nod*2,l,tree[nod*2].r)|find(nod*2+1,tree[nod*2+1].l,r));
}
signed main()
{
cin>>L>>T>>Q;
bt(1,1,L);
char type;
int AA,BB,CC;
for(int i = 1;i <=Q;i++)
{
cin>>type>>AA>>BB;
if(AA>BB)
swap(AA,BB);
if(type=='C')
{
cin>>CC;
change(1,AA,BB,CC);
continue;
}
else
{
int ans=find(1,AA,BB);
int cntt=0;
while(ans)
{
if(ans&1)cntt++;
ans>>=1;
}
cout<<cntt<<endl;
}
}
return 0;
}