#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
typedef long long ll;
ll color,n,m;
struct{
ll l,r,sum,lazy;
}t[N*4];
char op;
ll mid;
ll x,y,k;
ll ans,ans1;
void build(ll q,ll l,ll r){
t[q].l=l;
t[q].r=r;
t[q].lazy=0;
if(l==r){
t[q].sum=1;
return ;
}
mid=(l+r)/2;
build(q*2,l,mid);
build(q*2+1,mid+1,r);
t[q].sum=1;
}
void sqread(ll q){
if(t[q].lazy){
t[q*2].sum=(1<<t[q].lazy);
t[q*2+1].sum=(1<<t[q].lazy);
t[q*2].lazy=t[q].lazy;
t[q*2+1].lazy=t[q].lazy;
t[q].lazy=0;
}
}
void change(ll q,ll l,ll r,ll d){
if(t[q].l>=l&&t[q].r<=r){
t[q].lazy=d;
t[q].sum=1<<d;
return ;
}
sqread(q);
mid=(t[q].l+t[q].r)/2;
if(l<=mid) change(q*2,l,r,d);
if(r>mid) change(q*2+1,l,r,d);
t[q].sum=t[q*2].sum|t[q*2+1].sum;
}
ll ask(ll q,ll l,ll r){
if(t[q].l>=l&&t[q].r<=r){
return t[q].sum;
}
sqread(q);
ll ans2=0;
mid=(l+r)/2;
if(l<=mid) ans2|=ask(q*2,l,r);
if(r>mid) ans2|=ask(q*2+1,l,r);
return ans2;
}
signed main(){
scanf("%lld%lld%lld",&n,&color,&m);
build(1,1,n);
while(m--){
cin>>op;
if(op=='C'){
scanf("%lld%lld%lld",&x,&y,&k);
if(x>y) swap(x,y);
change(1,x,y,k);
}
else if(op=='P'){
scanf("%lld%lld",&x,&y);
if(x>y) swap(x,y);
ans=ask(1,x,y);
ans1=0;
for (ll i=1;i<=color;i++){
if(ans&(1<<i)){
ans1++;
}
}
printf("%lld\n",ans1);
}
}
return 0;
}