#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 1;
int l, t, o;
struct Block
{
int size, a[maxn], s[maxn], b[maxn], belong[maxn]; //b数组类似于lazy tag
void init()
{
size = pow(l, 0.5);
for(int i = 1; i <= l; ++i)
{
a[i] = s[i] = 1;
b[i] = 0;
belong[i] = (i - 1)/ size + 1;
}
}
void add(int x, int y, int k)
{
int st = belong[x], ed = belong[y];
if(st == ed)
{
for(int i = x; i <= y; ++i)
{
b[i] = 0;
a[i] = k;
}
s[st] = 0;
for(int i = (st - 1) * size + 1; i <= min(ed * size,l); ++i)
{
s[ed] |= b[i] ? b[i] : a[i];
}
return;
}
for(int i = x; belong[i] == st; ++i)
{
b[i] = 0;
a[i] = k;
}
s[st] = 0;
for(int i = (st - 1) * size + 1; i <= min(st * size,l); ++i)
{
s[st] |= b[i] ? b[i] : a[i];
}
for(int i = st + 1; i < ed; ++i)
{
s[i] = b[i] = k;
}
for(int i = y; belong[i] == ed; --i)
{
b[i] = 0;
a[i] = k;
}
s[ed] = 0;
for(int i = (ed - 1) * size + 1; i <= min(ed * size,l); ++i)
{
s[ed] |= b[i] ? b[i] : a[i];
}
}
int query(int x, int y)
{
int st = belong[x], ed = belong[y], res = 0;
if(st == ed)
{
for(int i = x; i <= y; ++i)
{
res |= b[i] ? b[i] : a[i];
}
return res;
}
for(int i = x; belong[i] == st; ++i)
{
res |= b[i] ? b[i] : a[i];
}
for(int i = st + 1; i < ed; ++i)
{
res |= s[i];
}
for(int i = y; belong[i] == ed; --i)
{
res |= b[i] ? b[i] : a[i];
}
return res;
}
int count(int a, int b)
{
int x = query(a, b), res = 0;
while(x)
{
res += (x & 1);
x >>= 1;
}
return res;
}
};
Block block;
int main()
{
scanf("%d %d %d", &l, &t, &o);
block.init();
for(int i = 0; i < o; ++i)
{
char opt;
int a, b;
scanf(" %c %d %d", &opt, &a, &b);
if(a > b)
{
swap(a, b);
}
if(opt == 'C')
{
int c;
scanf("%d", &c);
block.add(a, b, 1 << c - 1);
}
else
{
printf("%d\n", block.count(a, b));
}
}
return 0;
}