CODE:
#include <bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const int N=1e5+10;
int fun1(int x)
{
return (1LL<<(x-1));
}
int fun2(int x)
{
int sum=0;
while(x>0)
{
if((x&1)) sum++;
x>>=1;
}
return sum;
}
class tree
{
private:
struct node
{
int l,r,val,tag;
}tr[N<<2];
void push_up(node &u,node &ls,node &rs)
{
u.val=(ls.val|rs.val);
}
void push_up(int u)
{
if(tr[u].l==tr[u].r) return;
push_up(tr[u],tr[u<<1],tr[u<<1|1]);
}
void push_down(node &u,node &ls,node &rs)
{
ls.val=ls.val=rs.val=rs.tag=u.tag;
u.tag=0;
}
void push_down(int u)
{
if(tr[u].l==tr[u].r||tr[u].tag==0) return;
push_down(tr[u],tr[u<<1],tr[u<<1|1]);
}
public:
void build(int u,int l,int r)
{
if(l==r)
{
tr[u]={l,r,1,0};
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
tr[u]={l,r,1,0};
push_up(u);
}
void modify(int u,int l,int r,int x)
{
push_down(u);
if(tr[u].l==l&&tr[u].r==r)
{
tr[u].val=tr[u].tag=x;
return ;
}
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid) modify(u<<1,l,r,x);
else if(l>mid) modify(u<<1|1,l,r,x);
else
{
modify(u<<1,l,mid,x);
modify(u<<1|1,mid+1,r,x);
}
push_up(u);
}
node query(int u,int l,int r)
{
push_down(u);
if(tr[u].l==l&&tr[u].r==r) return tr[u];
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid) return query(u<<1,l,r);
else if(l>mid) return query(u<<1|1,l,r);
auto ls=query(u<<1,l,mid),rs=query(u<<1|1,mid+1,r);
node ans={l,r};push_up(ans,ls,rs);
return ans;
}
}T;
signed main()
{
int L,t,O;cin>>L>>t>>O;
T.build(1,1,L);
while(O--)
{
char op;cin>>op;
if(op=='C')
{
int l,r,x;cin>>l>>r>>x;
if(l>r) swap(l,r);
T.modify(1,l,r,fun1(x));
}
else
{
int l,r;cin>>l>>r;
if(l>r) swap(l,r);
cout<<fun2(T.query(1,l,r).val)<<'\n';
}
}
return 0;
}