传送门
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <bitset>
#include <math.h>
#define int long long
using namespace std;
const int N = 100005;
const int SS = 400;
const int CO = 40;
int col[N], L[SS], R[SS], tag[N];
bitset<CO>c[SS];
int n, t, q;
int ts;
void pre() {
L[0] = 0;
for (int i = 1; i <= n; i++) {
col[i] = 1;
}
for (int i = 1; i <= ts; i++) {
L[i] = L[i - 1] + 1;
R[i] = ts * i;
c[i].set(1);
}
if (R[ts] != n) {
R[ts + 1] = n;
L[ts + 1] = R[ts] + 1;
c[ts + 1].set(1);
}
return;
}
void pc(int id, int l, int r, int k) {
if (tag[id] != 0) {
for (int i = L[id]; i <= R[id]; i++) {
col[i] = tag[id];
}
tag[id] = 0;
}
for (int i = l; i <= r; i++)
col[i] = k;
c[id].reset();
for (int i = L[id]; i <= R[id]; i++)
c[id].set(col[i]);
return;
}
int query(int f, int t) {
int atf = ceil(f / SS), att = ceil(t / SS);
bitset<CO>b;
if (atf == att) {
if (tag[atf] != 0)
return 1;
int c;
for (int i = f; i <= t; i++)
b.set(col[i]);
return b.count();
}
if (tag[atf] != 0)
b.set(tag[atf]);
else
for (int i = f; i <= R[atf]; i++)
b.set(col[i]);
if (tag[att] != 0)
b.set(tag[att]);
else
for (int i = L[att]; i <= t; i++)
b.set(col[i]);
for (int i = atf + 1; i < att; i++)
b |= c[i];
return b.count();
}
void update(int f, int t, int k) {
int atf = ceil(f / SS), att = ceil(t / SS);
if (atf == att) {
pc(atf, f, t, k);
return;
}
pc(atf, f, R[atf], k);
pc(att, L[att], t, k);
for (int i = atf + 1; i < att; i++)
tag[i] = k;
return;
}
signed main() {
cin >> n >> t >> q;
ts = sqrt(n);
pre();
for (int i = 1; i <= q; i++) {
char opt;
int l, r, v;
cin >> opt;
scanf("%lld%lld", &l, &r);
if (opt == 'C') {
scanf("%lld", &v);
update(l, r, v);
}
if (opt == 'P') {
cout << query(l, r) << endl;
}
}
}