#include<bits/stdc++.h>
#define qmi int mid=(tree[k].l+tree[k].r)>>1
#define ls k>>1
#define rs k>>1|1
using namespace std;
int l,t,o;
struct node{
int l,r,qz[35],lazy;
}tree[400005];
void build(int k,int l,int r){
tree[k].l=l;
tree[k].r=r;
tree[k].qz[1]=r-l+1;
if(l==r){
return ;
}
qmi;
build(ls,l,mid);
build(rs,mid+1,r);
}
void push_down(int k){
if(tree[k].lazy){
tree[ls].lazy=tree[rs].lazy=tree[k].lazy;
memset(tree[ls].qz,0,sizeof(tree[ls].qz));
tree[ls].qz[tree[k].lazy]=tree[ls].r-tree[ls].l+1;
memset(tree[rs].qz,0,sizeof(tree[rs].qz));
tree[rs].qz[tree[k].lazy]=tree[rs].r-tree[rs].l+1;
tree[k].lazy=0;
}
return ;
}
void push_up(int k){
for(int i=1;i<=30;i++){
tree[k].qz[i]=tree[ls].qz[i]+tree[rs].qz[i];
}
}
int init(int a[]){
int sum=0;
for(int i=1;i<=30;i++){
sum+=(a[i]>0);
}
return sum;
}
void update(int k,int l,int r,int c){
if(tree[k].l>=l&&tree[k].r<=r){
memset(tree[k].qz,0,sizeof(tree[k].qz));
tree[k].qz[c]=tree[k].r-tree[k].l+1;
tree[k].lazy=c;
return ;
}
push_down(k);
qmi;
if(l<=mid){
update(ls,l,mid,c);
}
if(r>mid){
update(rs,mid+1,r,c);
}
push_up(k);
}
int query(int k,int l,int r){
if(tree[k].l>=l&&tree[k].r<=r){
return init(tree[k].qz);
}
push_down(k);
qmi;
int ans=0;
if(l<=mid){
ans+=query(ls,l,mid);
}
if(r>mid){
ans+=query(rs,mid+1,r);
}
return ans;
}
int main(){
cin>>l>>t>>o;
build(1,1,l);
while(o--){
char ch;
cin>>ch;
if(ch=='C'){
int x,y,z;
cin>>x>>y>>z;
if(x>y){
swap(x,y);
}
update(1,x,y,z);
}else{
int x,y;
cin>>x>>y;
if(x>y){
swap(x,y);
}
cout<<query(1,x,y)<<"\n";
}
}
return 0;
}