Cod sursa(job #40061)
Utilizator | Data | 27 martie 2007 11:00:18 | |
---|---|---|---|
Problema | Zeap | Scor | 0 |
Compilator | fpc | Status | done |
Runda | Arhiva de probleme | Marime | 5.7 kb |
program zeap;
const inf=161910;
type treap=^nod;
nod=record
v,p:longint;
st,dr:treap;
end;
var n,null:treap;
f,g:text;
mn:longint;
procedure init;
begin
new(null);
n:=null;
null^.p:=-inf;
null^.st:=nil;
null^.dr:=nil;
end;
function min(n:treap):longint;
begin
if n^.st=null then min:=n^.v else
min:=min(n^.st);
end;
function max(n:treap):longint;
begin
if n^.dr=null then max:=n^.v else
max:=max(n^.dr);
end;
procedure rot_dr(var n:treap);
var t:treap;
begin
t:=n^.st;
n^.st:=t^.dr;
t^.dr:=n;
n:=t;
end;
procedure rot_st(var n:treap);
var t:treap;
begin
t:=n^.dr;
n^.dr:=t^.st;
t^.st:=n;
n:=t;
end;
procedure insert(var n:treap;v,p:longint);
begin
if n=null then
begin
new(n);
n^.v:=v;
n^.p:=p;
n^.st:=null;
n^.dr:=null;
end else
if v<n^.v then
begin
insert(n^.st,v,p);
if n^.st^.p>n^.p then rot_st(n);
end
else
if v>n^.v then
begin
insert(n^.dr,v,p);
if n^.dr^.p>n^.p then rot_dr(n);
end;
end;
procedure sterge(var n:treap;v:longint);
begin
if n=null then writeln(g,'-1') else
begin
if v<n^.v then sterge(n^.st,v) else
if v>n^.v then sterge(n^.dr,v) else
begin
if n^.st^.p>n^.dr^.p then
rot_st(n) else
rot_dr(n);
if n<>null then
sterge(n,v) else
begin
dispose(n^.st);
n^.st:=nil;
end;
end;
end;
end;
function cauta(n:treap;v:longint):byte;
begin
if n=null then cauta:=0 else
if v<n^.v then
cauta:=cauta(n^.st,v) else
if v>n^.v then
cauta:=cauta(n^.dr,v) else
cauta:=1;
end;
procedure iofile;
begin
assign(f,'zeap.in');
reset(f);
assign(g,'zeap.out');
rewrite(g);
end;
procedure fmin(n:treap);
begin
if n^.st<>null then
begin
if abs(n^.v-n^.st^.v)<mn then
mn:=abs(n^.v-n^.st^.v);
fmin(n^.st);
end;
if n^.dr<>null then
begin
if abs(n^.v-n^.dr^.v)<mn then
mn:=abs(n^.v-n^.dr^.v);
fmin(n^.dr);
end;
end;
procedure prel;
var s,t:string;
x,y,z:longint;
code:integer;
p,i:longint;
begin
randomize;
while not eof(f) do
begin
readln(f,s);
if s[1]='I' then
begin
t:='';
for i:=3 to length(s) do
t:=t+s[i];
val(t,x,code);
p:=random(inf);
insert(n,x,p);
end else
if s[1]='S' then
begin
t:='';
for i:=3 to length(s) do
t:=t+s[i];
val(t,x,code);
sterge(n,x);
end else
if s[1]='C' then
begin
t:='';
for i:=3 to length(s) do
t:=t+s[i];
val(t,x,code);
writeln(g,cauta(n,x));
end else
if s='MAX' then
begin
x:=-1;
if (n<>null)and((n^.st<>null)or(n^.dr<>null)) then
begin
y:=min(n);
z:=max(n);
x:=abs(y-z);
if abs(z-y)>x then
x:=abs(z-y);
end;
writeln(g,x);
end;
if s='MIN' then
begin
mn:=maxlongint;
if n<>null then
fmin(n);
if mn=maxlongint then mn:=-1;
writeln(g,mn);
end;
end;
close(g);
end;
begin
init;
iofile;
prel;
end.