#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<bitset>
using namespace std;
const int N=1e5+5,LN=325,T=35;
int cl[LN][T],l[LN],r[LN],q[N],qn;
int a[N],um[LN];
bitset<T> tmp;
int n,t,m,zc;
char c;
inline void update(int x,int y,int v)
{
int qx=q[x],qy=q[y];
// printf("???%d %d\n",x,y);
if(um[qx])
{
for(int i=l[qx];i<=r[qx];i++)
a[i]=um[qx];
um[qx]=0;
}
if(um[qy])
{
for(int i=l[qy];i<=r[qy];i++)
a[i]=um[qy];
um[qy]=0;
}
if(qx==qy)
{
for(int i=x;i<=y;i++)
cl[qx][a[i]]--,cl[qx][v]++,a[i]=v;
// printf("V=%d\n",v);
return;
}
for(int i=x;i<=r[qx];i++)
cl[qx][a[i]]--,cl[qx][v]++,a[i]=v;
for(int i=l[qy];i<=y;i++)
cl[qy][a[i]]--,cl[qy][v]++,a[i]=v;
for(int i=qx+1;i<=qy-1;i++)
{
for(int j=1;j<=t;j++)
cl[i][j]=0;
cl[i][v]=r[i]-l[i]+1;
um[i]=v;
}
}
inline int query(int x,int y)
{
for(int i=1;i<=t;i++) tmp[i]=0;
int qx=q[x],qy=q[y];
if(qx==qy)
{
if(um[qx])
return 1;
for(int i=x;i<=y;i++)
tmp[a[i]]=1;
int ans=0;
for(int i=1;i<=t;i++)if(tmp[i])ans++;
return ans;
}
if(um[qx])
tmp[um[qx]]=1;
else
{
for(int i=x;i<=r[qx];i++)
tmp[a[i]]=1;
}
if(um[qy])
tmp[um[qy]]=1;
else
{
for(int i=l[qy];i<=y;i++)
tmp[a[i]]=1;
}
for(int i=qx+1;i<=qy-1;i++)
{
if(um[i]) tmp[um[i]]=1;
else
{
for(int j=1;j<=t;j++)
tmp[j]=cl[i][j]>0;
}
}
int ans=0;
for(int i=1;i<=t;i++)
if(tmp[i])
ans++;
return ans;
}
int x,y,z;
signed main()
{
// n=read(),t=read(),m=read();
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>t>>m;
zc=sqrt(n);
for(int i=1;i<=n;i+=zc)
{
l[++qn]=i,r[qn]=min(n,i+zc-1);
for(int j=i;j<=r[qn];j++)
q[j]=qn;
}
update(1,n,1);
for(int i=1;i<=m;i++)
{
// scanf("%c",&c);
cin>>c;
// printf("%c",c);
if(c=='C')
{
// scanf("%d%d%d",&x,&y,&z);
cin>>x>>y>>z;
if(x>y) x^=y^=x^=y;
update(x,y,z);
}
else
{
// scanf("%d%d",&x,&y);
cin>>x>>y;
if(x>y) x^=y^=x^=y;
// printf("%d\n",query(x,y));
cout<<query(x,y)<<endl;
}
}
// for(int i=1;i<=n;i++)
//// printf("%d ",um[q[i]]?um[q[i]]:a[i]);
// cout<<(um[q[i]]?um[q[i]]:a[i])<<" ";
}