#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,k,q;
struct node
{
int tree[N*2],tag[N*2];
void pushup(int cur)
{
if(tree[cur*2]==1||tree[cur*2+1]==1)
tree[cur]=1;
else
tree[cur]=0;
}
void addtag(int cur,int l,int r,int k)
{
tag[cur]=k;
tree[cur]=k;
}
void pushdown(int cur,int l,int r)
{
if(tag[cur]==-1)
return ;
int mid=l+r>>1;
addtag(cur*2,l,mid,tag[cur]);
addtag(cur*2+1,mid+1,r,tag[cur]);
tag[cur]=-1;
}
int find(int cur,int l,int r,int ql,int qr)
{
if(l>qr||r<ql)
return 0;
if(ql<=l&&r<=qr)
return tree[cur];
pushdown(cur,l,r);
int mid=l+r>>1;
return find(cur*2,l,mid,ql,qr)|find(cur*2+1,mid+1,r,ql,qr);
}
void update(int cur,int l,int r,int ql,int qr,int k)
{
if(l>qr||r<ql)
return ;
if(ql<=l&&r<=qr)
{
addtag(cur,l,r,k);
return ;
}
pushdown(cur,l,r);
int mid=l+r>>1;
update(cur*2,l,mid,ql,qr,k);
update(cur*2+1,mid+1,r,ql,qr,k);
pushup(cur);
}
}a[35];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k>>q;
a[1].update(1,1,n,1,n,1);
for(int i=1;i<=q;i++)
{
char op;
int l,r,k;
cin>>op>>l>>r;
if(l>r)
swap(l,r);
if(op=='C')
{
int k;
cin>>k;
for(int j=1;j<=30;j++)
a[j].update(1,1,n,l,r,0);
a[k].update(1,1,n,l,r,1);
}
else if(op=='P')
{
int ans=0;
for(int j=1;j<=30;j++)
ans+=a[j].find(1,1,n,l,r);
cout<<ans<<"\n";
}
}
return 0;
}
代码