RT
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define sp() putchar(' ')
#define et() putchar(' \n')
#define nw tree[x]
#define lt tree[x << 1]
#define rt tree[x << 1 | 1]
#define ls x << 1
#define rs x << 1 | 1
using namespace std;
inline ll rd() {
ll x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - 48, ch = getchar();
return x * f;
}
inline void wt(ll x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) wt(x / 10);
putchar(x % 10 + '0');
return;
}
struct node {
ll l, r, sm, lz;
} tree[414514];
ll n, m, t, a[114514];
void bd(ll x, ll l, ll r) {
nw.l = l, nw.r = r;
if(l == r) {nw.sm = 2; return; }
ll mid = (l + r) >> 1;
bd(ls, l, mid), bd(rs, mid + 1, r);
nw.sm = lt.sm | rt.sm;
return;
}
void dn(ll x) {
lt.lz = nw.lz, rt.lz = nw.lz;
lt.sm = nw.lz, rt.sm = nw.lz;
nw.lz = 0;
return;
}
void ad(ll x, ll l, ll r, ll k) {
if(nw.lz) dn(x);
if(nw.r < l || nw.l > r) return;
if(nw.l >= l && nw.r <= r) {
nw.sm = 1 << k;
nw.lz = 1 << k;
return;
}
ad(ls, l, r, k), ad(rs, l, r, k);
nw.sm = lt.sm | rt.sm;
return;
}
ll fd(ll x, ll l, ll r) {
if(nw.lz) dn(x);
if(nw.r < l || nw.l > r) return 0;
if(nw.l >= l && nw.r <= r) return nw.sm;
return fd(ls, l, r) | fd(rs, l, r);
}
ll ct(ll x) {
int ans = 0;
while(x) ans += x & 1, x >>= 1;
return ans;
}
int main() {
n = rd(), t = rd(), m = rd();
bd(1, 1, n);
for(ll i = 1; i <= m; i++) {
char c = getchar();
ll l = rd(), r = rd(), k;
if(l > r) swap(l, r);
if(c == 'C') k = rd(), ad(1, l, r, k);
if(c == 'P') wt(ct(fd(1, l, r))), et();
}
return 0;
}