P1558 色板游戏
#include<bits/stdc++.h>
#define int long long
#define up(x) tree[x].sum=tree[x*2].sum|tree[x*2+1].sum
using namespace std;
struct node
{
int l,r,sum,lazy;
}tree[1000005];
int n,m,a[1000005];
int get_sum(int x)
{
int sum=1;
while(x--)
{
sum*=2;
}
return sum;
}
void down(int id)
{
if(tree[id].lazy==0)return;
tree[id*2].lazy=tree[id*2].sum=tree[id*2+1].lazy=tree[id*2+1].sum=tree[id].lazy;
tree[id].lazy=0;
}
void build(int id,int l,int r)
{
tree[id].l=l;
tree[id].r=r;
if(l==r)
{
tree[id].sum=1;
return;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
up(id);
}
void update(int id,int l,int r,int v)
{
if(tree[id].l>r||tree[id].r<l)return;
if(tree[id].l>=l&&tree[id].r<=r)
{
tree[id].lazy=tree[id].sum=get_sum(v-1);
return;
}
down(id);
update(id*2,l,r,v);
update(id*2+1,l,r,v);
up(id);
}
int query(int id,int l,int r)
{
if(tree[id].l>r||tree[id].r<l)return 0;
if(tree[id].l>=l&&tree[id].r<=r)return tree[id].sum;
down(id);
return query(id*2,l,r)|query(id*2+1,l,r);
}
int get_ans(int x)
{
int ans=0;
while(x)
{
if(x%2==1)ans++;
x/=2;
}
cout<<ans<<"\n";
}
signed main()
{
cin>>n>>m>>m;
build(1,1,n);
while(m--)
{
char o;
int l,r,k;
cin>>o>>l>>r;
if(l>r)swap(l,r);
if(o=='C')
{
cin>>k;
update(1,l,r,k);
}
else get_ans(query(1,l,r));
}
return 0;
}