#include<bits/stdc++.h>
using namespace std;
int read()
{
int f=1,k=0;char c=getchar();
while('0'>c||'9'<c){if(c=='-'){f=-1;}c=getchar();}
while(c>='0'&&c<='9'){k=(k<<3)+(k<<1)+(c^48);c=getchar();}
return f*k;
}
void write(int x)
{
if(x==0){putchar('0');return;}
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
#define ls rt<<1
#define rs rt<<1|1
const int maxn=100010;
struct sgt
{
int tag,kind;
}t[4*maxn];
int len,ttt,o;
void pushup(int rt)
{
t[rt].kind=t[ls].kind|t[rs].kind;
}
void build(int rt,int l,int r)
{
t[rt].tag=0;
if(l==r)
{
t[rt].kind=1;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
void pushdown(int rt)
{
if(t[rt].tag)
{
t[ls].tag=t[rt].tag;
t[ls].kind=t[rt].tag;
t[rs].tag=t[rt].tag;
t[rs].kind=t[rt].tag;
t[rt].tag=0;
}
}
void update(int rt,int l,int r,int ql,int qr,int x)
{
if(ql<=l&&r<=qr)
{
t[rt].tag=1<<(x-1);
t[rt].kind=1<<(x-1);
return;
}
pushdown(rt);
int mid=(l+r)>>1;
if(ql<=mid)update(ls,l ,mid,ql,qr,x);
if(qr>mid) update(rs,mid+1,r ,ql,qr,x);
pushup(rt);
}
int query(int rt,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return t[rt].kind;
}
pushdown(rt);
int mid=(l+r)>>1;
if(qr<=mid)return query(ls,l,mid,ql,qr);
else if(ql>mid)return query(rs,mid+1,r,ql,qr);
else return query(ls,l,mid,ql,qr)|query(rs,mid+1,r,ql,qr);
}
int main()
{
len=read();ttt=read();o=read();
build(1,1,len);
while(o--)
{
char tmp[2];
scanf("%s",tmp);
if(tmp[0]=='C')
{
int a,b,c;
a=read(),b=read(),c=read();
update(1,1,len,a,b,c);
}
else
{
int a=read(),b=read();
int x=query(1,1,len,a,b);
int cnt=0;
while(x)
{
if(x&1)
{
cnt++;
}
x=x>>1;
}
write(cnt);
putchar('\n');
}
}
return 0;
}