Cod sursa(job #40062)

Utilizator vanila0406Ionescu Victor vanila0406 Data 27 martie 2007 11:01:06
Problema Zeap Scor 20
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_st(var n:treap);
var t:treap;
begin
        t:=n^.st;
        n^.st:=t^.dr;
        t^.dr:=n;
        n:=t;
end;



procedure rot_dr(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.