#include <iostream> using namespace std; #define MAX 100002 #define MAXN 32 struct TNode { int left, right; int n; }; TNode T[MAX*3]; bool hash[MAXN]; int cnt; void build(int s, int t, int step) { T[step].left = s; T[step].right = t; T[step].n = 0; if(s == t) return; int mid = (s + t) >> 1; build(s, mid, step*2); build(mid+1, t, step*2+1); } void insert(int s, int t, int step, int color) { if(s == T[step].left && t == T[step].right) { T[step].n = color; return; } if(T[step].n != 0) { T[step*2].n = T[step*2+1].n = T[step].n; T[step].n = 0; } int mid = (T[step].left + T[step].right) >> 1; if(t <= mid) insert(s, t, step*2, color); else if(s > mid) insert(s, t, step*2+1, color); else { insert(s,mid, step*2, color); insert(mid+1, t, step*2+1, color); } } void calculate(int s, int t, int step) { if(T[step].n != 0) { if(hash[T[step].n] != true) { hash[T[step].n] = true; cnt++; } return; } int mid = (T[step].left + T[step].right) >> 1; if(t <= mid) calculate(s, t, step*2); else if(s > mid) calculate(s, t, step*2+1); else { calculate(s, mid, step*2); calculate(mid+1, t, step*2+1); } } int main() { int L, M, N; char ch; int left, right, color; scanf("%d%d%d", &L, &M ,&N); getchar(); build(1, L, 1); T[1].n = 1; while(N--) { ch = getchar(); scanf("%d%d", &left, &right); if(ch == 'C') { scanf("%d", &color); if(left <= right) insert(left, right, 1, color); else insert(right, left, 1, color); } else { cnt = 0; memset(hash, false, sizeof(hash)); if(left <= right) calculate(left, right, 1); else calculate(right, left, 1); printf("%d/n", cnt); } getchar(); } return 0; } /* //179 4713253 xiaofengsheng 3280K 329MS C++ 1823B 2009-03-03 12:45:55 */