#include<iostream>
#include<cstdint>
#include<cmath>
using namespace std;
const int N = 1e5 + 5;
#define int long long
struct node{
int l, r;
int color;
int tag;
}tree[N << 2];
void pushup(int k){
int lc = k * 2;
int rc = k * 2 + 1;
tree[k].color = tree[lc].color | tree[rc].color;
}
void add_tag(int k, int v){
tree[k].tag = v;
tree[k].color = v;
}
void pushdown(int k){
int lc = k * 2;
int rc = k * 2 + 1;
if(tree[k].tag){
add_tag(lc, tree[k].tag);
add_tag(rc, tree[k].tag);
tree[k].tag = 0;
}
}
void build(int k, int l, int r){
tree[k].l = l, tree[k].r = r;
if(l == r){
tree[k].color = 1;
return;
}
int mid = (l + r) >> 1;
int lc = k * 2;
int rc = k * 2 + 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(k);
}
void modify(int k, int l, int r, int c){
if(tree[k].l >= l && tree[k].r <= r){
add_tag(k, c);
return;
}
pushdown(k);
int mid = (tree[k].l + tree[k].r) >> 1;
int lc = k * 2;
int rc = k * 2 + 1;
if(r <= mid) modify(lc, l, r, c);
else if(l > mid) modify(rc, l, r, c);
else modify(lc, l, mid, c), modify(rc, mid + 1, r, c);
pushup(k);
}
int query(int k, int l, int r){
if(tree[k].l >= l && tree[k].r <= r){
return tree[k].color;
}
pushdown(k);
int mid = (tree[k].l + tree[k].r) >> 1;
int lc = k * 2;
int rc = k * 2 + 1;
if(r <= mid) return query(lc, l, r);
else if(l > mid) return query(rc, l, r);
else return query(lc, l, mid) | query(rc, mid + 1, r);
}
void solve(){
int n, t, o;
cin >> n >> t >> o;
build(1, 1, n);
for(int i = 1; i <= o; i++){
char op;
int l, r;
cin >> op >> l >> r;
if(op == 'C'){
int c;
cin >> c;
modify(1, l, r, 1 << c - 1);
}else{
int color = query(1, l, r);
int ans = 0;
while(color){
if(color & 1) ans++;
color >>= 1;
}
cout << ans << '\n';
}
}
}
signed main(){
int t = 1;
while(t--){
solve();
}
return 0;
}