#include<bits/stdc++.h>
using namespace std;
const int kkk=1e6+5;
int n,m,q;
struct stree{
bool lazy[35],color[35];
int l,r;
}tree[kkk];
void build(int id,int l,int r){
for(int i=1;i<=m;i++){
tree[id].lazy[i]=0;
tree[id].color[i]=0;
}
tree[id].color[1]=1;
tree[id].l=l,tree[id].r=r;
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
}
void push_down(int x)
{
if(tree[x].l!=tree[x].r)
for(int i=1;i<=m;i++){
if(tree[x].lazy[i]){
tree[x*2].color[i]=1;
tree[x*2].color[i]=1;
tree[x].lazy[i]=0;
}
}
}
void up_data(int index,int l,int r,int k)
{
if(tree[index].r<=r && tree[index].l>=l)
{
tree[index].lazy[k]=1;
tree[index].color[k]=1;
return ;
}
push_down(index);
if(tree[index*2].r>=l)
up_data(index*2,l,r,k);
if(tree[index*2+1].l<=r)
up_data(index*2+1,l,r,k);
for(int i=1;i<=m;i++){
if(tree[2*index].color[i] || tree[2*index+1].color[i])
tree[index].color[i]=1;
}
return ;
}
bool search(int index,int l,int r,int k)
{
if(tree[index].l>=l && tree[index].r<=r)
return tree[index].color[k];
push_down(index);
int num=0;
if(tree[index*2].r>=l)
num=num||search(index*2,l,r,k);
if(tree[index*2+1].l<=r)
num=num||search(index*2+1,l,r,k);
return num;
}
int get(int index,int l,int r){
int ans=0;
for(int i=1;i<=m;i++)
ans+=search(index,l,r,i);
return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&q);
build(1,1,n);
for(int i=1;i<=q;i++){
char op;
int a,b;
scanf("%c%d%d",&op,&a,&b);
if(op=='C'){
int c;
scanf("%d",&c);
up_data(1,a,b,c);
}
else{
printf("%d\n",get(1,a,b));
}
}
return 0;
}