#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct chtholly
{int l,r,v;};
struct tr
{
unsigned long long kind;
int l,r,pri,del;
chtholly node;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define p(x) tree[x].pri
#define n(x) tree[x].node
#define k(x) tree[x].kind
#define d(x) tree[x].del
}tree[maxn];
int cnt;stack<int> bin;
int rt,x,y,z;
inline int count(unsigned long long x)
{
int ans=0;
while(x!=0)
{
x-=x&(-x);
ans++;
}
return ans;
}
inline void update(int now)
{
if(!now) return;
k(now)=(1<<(n(now).v));
if(l(now)) k(now)|=k(l(now));
if(r(now)) k(now)|=k(r(now));
}
inline void clean(int now)
{
l(x)=0;r(x)=0;p(x)=0;k(x)=0;
n(x).l=n(x).r=n(x).v=0;
}
inline void pushdown(int now)
{
if(l(x))
bin.push(l(x));
if(r(x))
bin.push(r(x));
}
//=============================================================================
int newnode(int v,int l,int r)
{
int po;
if(!bin.empty())
{
po=bin.top();
pushdown(po);
clean(po);
}
else po=cnt++;
p(po)=rand();
n(po).l=l;n(po).r=r,n(po).v=v;
k(po)=(1<<n(cnt).v);
return po;
}
void split(int now,int val,int &x,int &y)
{
if(!now) x=y=0;
else
{
if(n(now).l<=val)
{
x=now;
split(r(now),val,r(now),y);
}
else
{
y=now;
split(l(now),val,x,l(now));
}
}
update(now);
}
int merge1(int x,int y)
{
if(!x||!y) return x+y;
if(p(x)>p(y))
{
r(x)=merge1(r(x),y);
update(x);
return x;
}
else
{
l(y)=merge1(x,l(y));
update(y);
return y;
}
}
//==========================================================================
void regionsplit(int l,int r)
{
split(rt,l-1,x,y);
split(y,r,y,z);
int po1=x,po2=y;
while(r(po1)) po1=r(po1);
while(r(po2)) po2=r(po2);
int l1,r1,v1;
if(n(po1).r>=l)
{
r1=n(po1).r,v1=n(po1).v;
n(po1).r=l-1;
y=merge1(newnode(v1,l,r1),y);
}
if(n(po2).r>r)
{
l1=n(po2).l,v1=n(po2).v;
n(po2).r=r;
z=merge1(newnode(v1,r+1,r1),z);
}
}
void pushiron(int l,int r,int v)
{
regionsplit(l,r);
bin.push(y);
rt=merge1(x,merge1(newnode(v,l,r),z));
}
int ask(int l,int r)
{
regionsplit(l,r);
int ans=count(k(y));
rt=merge1(x,merge1(y,z));
return ans;
}
int main()
{
int n,t,m;
//scanf("%d %d %d",&n,&t,&o)
cin>>n>>t>>m;
rt=newnode(1,0,n);
for(int i=1;i<=m;i++)
{
char opt;int l,r,v;
cin>>opt>>l>>r;
if(opt=='C')
{
cin>>v;
pushiron(l,r,v);
}
else cout<<ask(l,r)<<endl;
}
return 0;
}