#include<bits/stdc++.h>
#define per(i,l,r) for(int i(r), i##end(l); i>=i##end; --i)
#define rep(i,l,r) for(int i(l), i##end(r); i<=i##end; ++i)
#define ll long long
#define pb push_back
using namespace std;
const int maxn = 100000+100;
int L, T, O; char opt; int a, b, c;
int tree[maxn<<2], lazy[maxn<<2];
void push_down(int index) {
lazy[index] && (tree[index] = (tree[index]|lazy[index]), lazy[index*2]|=lazy[index], lazy[index*2+1]|=lazy[index], lazy[index] = 0);
}
int calc(int index, int ans = 0) {
rep(i, 1, T) (index & (1<<i)) && (ans++);
return ans;
}
void modify(int l, int r, int index, int left, int right, int col) {
push_down(index);
if(left <= l && r <= right) {
lazy[index] = lazy[index] | (1<<col);
return;
}
if(right < l || r < left) return;
int mid = l + r >> 1;
modify(l, mid, index*2, left, right, col); modify(mid+1, r, index*2+1, left, right, col);
}
int ask(int l, int r, int index, int left, int right) {
push_down(index);
if(left <= l && r <= right) {
return tree[index];
}
if(right < l || r < left) return 0;
int mid = l + r >> 1;
return ask(l, mid, index*2, left, right) | ask(mid+1, r, index*2+1, left, right);
}
int main() {
cin >> L >> T >> O;
modify(1, L, 1, 1, L, 1);
rep(i, 1, O) {
cin >> opt;
if(opt == 'C') {
cin >> a >> b >> c;(a>b)&&(a=a^b, b=a^b, a=a^b);
if(a > b) swap(a, b);
modify(1, L, 1, a, b, c);
} else {
cin >> a >> b; (a>b)&&(a=a^b, b=a^b, a=a^b);
if(a > b) swap(a, b);
cout << calc(ask(1, L, 1, a, b)) << endl;
}
}
return 0;
}