题目大意
给一个固定长度为L的画板
有两个操作:
C A B C:区间AB内涂上颜色C。
P A B:查询区间AB内颜色种类数。
分析
和zoj1610差不多,不解释。
A B可以A>B
代码
type
pnode=^tnode;
tnode=record
lc,rc:pnode;
c:longint;
end;
var
t:pnode;
i,j,k:longint;
x,y,x1,y1:longint;
n,m,nm:longint;
ans:longint;
f:array[-2..10000] of int64;
s:char;
procedure neww(var t:pnode);
begin
if t=nil then
begin
new(t);
t^.c:=1;
t^.lc:=nil;
t^.rc:=nil;
end;
end;
procedure insert(var t:pnode; l,r,x,y,ce:longint);
var
i,j,k:longint;
mid:longint;
begin
with t^ do
begin
if c<>ce then
begin
mid:=(l+r) div 2;
if (l=x) and (r=y)
then
begin
c:=ce;
exit;
end;
if c<>-1
then
begin
neww(lc);
neww(rc);
lc^.c:=t^.c;
rc^.c:=t^.c;
t^.c:=-1;
end;
if (l<=x) and (mid>=y)
then
begin
neww(lc);
insert(lc,l,mid,x,y,ce);
exit;
end;
if (mid<x) and (r>=y)
then
begin
neww(rc);
insert(rc,mid+1,r,x,y,ce);
exit;
end;
neww(lc);
neww(rc);
insert(lc,l,mid,x,mid,ce);
insert(rc,mid+1,r,mid+1,y,ce);
end;
end;
end;
procedure find(t:pnode;l,r,x,y:longint);
var
mid:longint;
begin
neww(t);
with t^ do
begin
mid:=(l+r) div 2;
if c<>-1
then
begin
f[c]:=1;
exit;
end;
if (l<=x) and (mid>=y) and (l<>r)
then
begin
find(lc,l,mid,x,y);
exit;
end;
if (mid<x) and (r>=y) and (l<>r)
then
begin
find(rc,mid+1,r,x,y);
exit;
end;
if l<>r then begin
find(lc,l,mid,x,mid);
find(rc,mid+1,r,mid+1,y);
end;
end;
end;
begin
while not eof do begin
readln(m,nm,n);
fillchar(t,sizeof(t),0);
fillchar(f,sizeof(f),0);
neww(t);
for i:=1 to n do
begin
read(s,x,y);
if s='P'
then
begin
fillchar(f,sizeof(f),0);
if x>y then
begin
x1:=x;
x:=y;
y:=x1;
end;
x1:=0; y1:=0;
ans:=0;
find(t,1,m,x,y);
for x1:=1 to 30 do
if f[x1]<>0 then inc(ans);
writeln(ans);
readln;
end
else
begin
readln(j);
if x>y then
begin
x1:=x;
x:=y;
y:=x1;
end;
insert(t,1,m,x,y,j);
end;
end;
end;
end.