线段树……
Program p2777;
const
maxl=100000;
maxt=30;
maxo=100000;
var
l,t,o,i,j,k:longint;
col:array[1..maxl*10] of longint;
c:char;
x,y,color:longint;
visit:array[1..maxt] of boolean;
procedure build(l,r,root:longint);
var
mid:longint;
begin
if l=r then
begin
col[root]:=1;
exit;
end;
mid:=(l+r) shr 1;
build(l,mid,root shl 1);
build(mid+1,r,root shl 1+1);
col[root]:=1;
end;
procedure swap(var a,b:longint);
var
p:longint;
begin
p:=a;a:=b;b:=p;
end;
procedure detate(l,r,sonl,sonr,root,color:longint);
var
i,j,mid:longint;
begin
mid:=(l+r) shr 1;
if l=r then
begin
col[root]:=color;
exit;
end;
if (sonl<=l) and (r<=sonr) then
begin
col[root]:=color;
exit;
end;
if col[root]>0 then
begin
col[root*2]:=col[root];
col[root*2+1]:=col[root];
col[root]:=-1;
end;
if not((mid<sonl) or (sonr<l)) then detate(l,mid,sonl,sonr,root shl 1,color);
if not((r<sonl) or (sonr<mid+1)) then detate(mid+1,r,sonl,sonr,root shl 1+1,color);
end;
function quere(l,r,sonl,sonr,root:longint):longint;
var
mid,i,j:longint;
begin
quere:=0;
mid:=(l+r) shr 1;
if col[root]>0 then
begin
if not(visit[col[root]]) then
begin
visit[col[root]]:=true;
exit(1);
end;
exit(0);
end;
if not((mid<sonl) or (sonr<l)) then inc(quere,quere(l,mid,sonl,sonr,root shl 1));
if not((r<sonl) or (sonr<mid+1)) then inc(quere,quere(mid+1,r,sonl,sonr,root shl 1+1));
end;
begin
readln(l,t,o);
build(1,l,1);
for i:=1 to o do
begin
read(c);
if c='C' then
begin
readln(x,y,color);
if x>y then swap(x,y);
detate(1,l,x,y,1,color);
end
else
begin
readln(x,y);
if x>y then swap(x,y);
fillchar(visit,sizeof(visit),false);
writeln(quere(1,l,x,y,1));
end;
end;
end.