rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e7;
int n,tt,m;
struct tree{
int l,r,sum,tag;
}t[N*4];
void build(int x,int l,int r){
t[x].l=l;t[x].r=r;
if(l==r){
t[x].sum=1;
t[x].tag=0;
return;
}
int mid=(l+r)/2;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
t[x].sum=t[x<<1].sum|t[x<<1|1].sum;
}
void down(int x){
t[x<<1].tag=t[x].tag;
t[x<<1|1].tag=t[x].tag;
t[x<<1].sum=t[x].tag;
t[x<<1|1].sum=t[x].tag;
t[x].tag=0;
}
int getsum(int x){
int sum=0;
while(x){
sum+=x&1;
x>>=1;
}
return sum;
}
int gettwo(int x){
return pow(2,x-1);
}
void modify(int x,int l,int r,int k){
if(t[x].l>r||t[x].r<l)return;
if(t[x].l>=l&&t[x].r<=r){
t[x].sum=k;
t[x].tag=k;
}
if(t[x].tag)down(x);
int mid=(t[x].l+t[x].r)/2;
if(l<=mid)modify(x<<1,l,r,k);
if(r>mid)modify(x<<1|1,l,r,k);
t[x].sum=t[x<<1].sum|t[x<<1|1].sum;
}
int query(int x,int l,int r){
if(t[x].l>r||t[x].r<l)return 0;
else if(t[x].l>=l&&t[x].r<=r){
return t[x].sum;
}
if(t[x].tag)down(x);
int ans=0;
int mid=(t[x].l+t[x].r)/2;
if(l<=mid)ans|=query(x<<1,l,r);
if(r>mid)ans|=query(x<<1|1,l,r);
return ans;
}
signed main(){
scanf("%lld %lld %lld",&n,&tt,&m);
build(1,1,n);
while(m--){
char op;
scanf("%s",&op);
if(op=='C'){
int l,r,k;
scanf("%lld %lld %lld",&l,&r,&k);
if(l>r)swap(l,r);
modify(1,l,r,gettwo(k));
}
else{
int l,r;
scanf("%lld %lld",&l,&r);
if(l>r)swap(l,r);
int p=query(1,l,r);
printf("%lld\n",getsum(p));
}
}
}