//蛮水的线段树
//用scanf() 用位运算
#include <cstdio>
#include <cstring>
using namespace std; const int MAXL = 100000 + 5;
const int MAXT = 30 + 5;
int L, T, O, a, b, c, ans;
bool vis[MAXT * 3];
char cmd;
struct node{
int l, r;
int c;
};
node tree[MAXL * 3]; void build(int i, int l, int r){
tree[i].l = l; tree[i].r = r;
tree[i].c = (i==1? 1 : 0); //注意题意:起始时刻颜色为1!
if(tree[i].l == tree[i].r) return;
int mid = (l + r) >> 1;
build(i<<1, l, mid);
build(i<<1 | 1, mid+1, r);
} void insert(int i, int l, int r, int c){
if(tree[i].l == l && tree[i].r == r){
tree[i].c = c;
return;
} if(tree[i].l == tree[i].r) return; if(tree[i].c > 0 && tree[i].c != c){
tree[i<<1].c = tree[i].c;
tree[i<<1|1].c = tree[i].c;
tree[i].c = 0;
}
int mid = (tree[i].l + tree[i].r) >> 1; //开始居然写成(l+r)>>1!!WA了n次
if(r <= tree[i<<1].r){
insert(i<<1, l, r, c);
}
else if(l >= tree[i<<1|1].l){
insert(i<<1|1, l, r, c);
}
else{
insert(i<<1, l, mid, c);
insert(i<<1|1, mid+1, r, c);
}
} void cal(int i, int l, int r){
if(tree[i].r < l || tree[i].l > r) return;
if(tree[i].c > 0){
if(!vis[tree[i].c]){
vis[tree[i].c] = 1;
ans++;
}
return;
}
cal(i<<1, l, r);
cal(i<<1 | 1, l, r);
} int main(){
scanf("%d%d%d", &L, &T, &O);
build(1, 1, L); for(int i=0; i<O; i++){
scanf("%c", &cmd);
scanf("%c", &cmd); if(cmd == 'C'){
scanf("%d%d%d", &a, &b, &c);
if(a <= b)
insert(1, a, b, c); else{
insert(1, b, a, c); //a>b 则从b到a (题意没表述清)
}
}
else{
scanf("%d%d", &a, &b);
ans = 0;
memset(vis, 0, sizeof(vis));
if(a <= b)
cal(1, a, b);
else{
cal(1, b, a);
}
printf("%d\n", ans);
}
//
2777//用scanf() 用位运算
#include <cstdio>
#include <cstring>
using namespace std; const int MAXL = 100000 + 5;
const int MAXT = 30 + 5;
int L, T, O, a, b, c, ans;
bool vis[MAXT * 3];
char cmd;
struct node{
int l, r;
int c;
};
node tree[MAXL * 3]; void build(int i, int l, int r){
tree[i].l = l; tree[i].r = r;
tree[i].c = (i==1? 1 : 0); //注意题意:起始时刻颜色为1!
if(tree[i].l == tree[i].r) return;
int mid = (l + r) >> 1;
build(i<<1, l, mid);
build(i<<1 | 1, mid+1, r);
} void insert(int i, int l, int r, int c){
if(tree[i].l == l && tree[i].r == r){
tree[i].c = c;
return;
} if(tree[i].l == tree[i].r) return; if(tree[i].c > 0 && tree[i].c != c){
tree[i<<1].c = tree[i].c;
tree[i<<1|1].c = tree[i].c;
tree[i].c = 0;
}
int mid = (tree[i].l + tree[i].r) >> 1; //开始居然写成(l+r)>>1!!WA了n次
if(r <= tree[i<<1].r){
insert(i<<1, l, r, c);
}
else if(l >= tree[i<<1|1].l){
insert(i<<1|1, l, r, c);
}
else{
insert(i<<1, l, mid, c);
insert(i<<1|1, mid+1, r, c);
}
} void cal(int i, int l, int r){
if(tree[i].r < l || tree[i].l > r) return;
if(tree[i].c > 0){
if(!vis[tree[i].c]){
vis[tree[i].c] = 1;
ans++;
}
return;
}
cal(i<<1, l, r);
cal(i<<1 | 1, l, r);
} int main(){
scanf("%d%d%d", &L, &T, &O);
build(1, 1, L); for(int i=0; i<O; i++){
scanf("%c", &cmd);
scanf("%c", &cmd); if(cmd == 'C'){
scanf("%d%d%d", &a, &b, &c);
if(a <= b)
insert(1, a, b, c); else{
insert(1, b, a, c); //a>b 则从b到a (题意没表述清)
}
}
else{
scanf("%d%d", &a, &b);
ans = 0;
memset(vis, 0, sizeof(vis));
if(a <= b)
cal(1, a, b);
else{
cal(1, b, a);
}
printf("%d\n", ans);
}
}
}