#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(isdigit(ch))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int L,T,O;
const int maxn=2.7e5;
int col[maxn];
struct Segmenttree
{
int l,r,clr;
bool all;
}t[maxn*4];
bool pd[35];
void spread(int p)
{
t[p*2].clr=t[p].clr;
t[p*2+1].clr=t[p].clr;
t[p*2].all=t[p*2+1].all=1;
}
void pushup(int p)
{
if(t[p*2].all && t[p*2+1].all && t[p*2].clr==t[p*2+1].clr)
{
t[p].clr=t[p*2].clr;
t[p].all=1;
}
}
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
t[p].all=1,t[p].clr=1;
if(l==r)
return ;
int mid=(l+r)>>1;
if(l<=mid)
build(p*2,l,mid);
if(r>mid)
build(p*2+1,mid+1,r);
}
void change(int p,int l,int r,int c)
{
if(l<=t[p].l && r>=t[p].r)
{
t[p].all=1;
t[p].clr=c;
return ;
}
if(t[p].all)
spread(p);
t[p].all=0;
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid)
change(p*2,l,r,c);
if(r>mid)
change(p*2+1,l,r,c);
pushup(p);
}
int ans;
void query(int p,int l,int r)
{
if(t[p].all)
spread(p);
if(t[p].all)
{
if(!pd[t[p].clr])
{
pd[t[p].clr]=1;
ans++;
return ;
}
return ;
}
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid)
query(p*2,l,r);
if(r>mid)
query(p*2+1,l,r);
pushup(p);
}
int main()
{
L=read(),T=read(),O=read();
char opt;
int a,b,c;
build(1,1,L);
while(O--)
{
do{opt=getchar();}
while(opt!='C' && opt!='P');
if(opt=='C')
{
scanf("%d%d%d",&a,&b,&c);
if(a>b)
swap(a,b);
change(1,a,b,c);
}
if(opt=='P')
{
memset(pd,0,sizeof pd);
ans=0;
scanf("%d%d",&a,&b);
if(a>b)
swap(a,b);
query(1,a,b);
printf("%d\n",ans);
}
}
return 0;
}