Cod sursa(job #484432)

Utilizator 05_YohnE1 La5c01 05_Yohn Data 14 septembrie 2010 14:45:50
Problema Heapuri Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.52 kb
var H,z,q:array[1..200000]of longint;
buf:array[1..1 shl 17]of char;
m,n,i,x,c:longint;
op:byte;

procedure interschimba(a,b:longint);
var x:longint;
begin
x:=H[a]; H[a]:=H[b]; H[b]:=x;
q[z[a]]:=b;
q[z[b]]:=a;
x:=z[a]; z[a]:=z[b]; z[b]:=x;
end;

procedure get_up(k:longint);
var p:longint;
begin
p:=k shr 1;
while (p>0)and(H[p]>H[k]) do begin
      interschimba(p,k);
      k:=p;
      p:=k shr 1;
end;
end;

procedure get_down(k:longint);
var s:longint;
begin
if k shl 1 <= n then begin
   s:=k shl 1;
   if (s<n)and(H[s]<H[s+1]) then inc(s);
   if H[s]>=H[k] then s:=0;
   end
   else s:=0;
while s>0 do begin
      interschimba(k,s);
      k:=s;
      if k shl 1 < n then begin
         s:=k shl 1;
         if (s<n)and(H[s]<H[s+1]) then inc(s);
         if H[s]>=H[k] then s:=0;
         end
         else s:=0;
      end;
end;



procedure baga(x:longint);
begin
n:=n+1;
inc(c);
H[n]:=x;
z[n]:=c;
q[c]:=n;
get_up(n);
end;

procedure scoate(x:longint);
var poz:longint;
begin
poz:=q[x];
interschimba(n,poz);
z[n]:=0;
q[x]:=0;
H[n]:=0;
dec(n);
get_up(poz);
get_down(poz);
end;


begin
assign(input,'heapuri.in');
reset(input);
settextbuf(input,buf);
assign(output,'heapuri.out');
rewrite(output);
read(m);
n:=0;
c:=0;
for i:=1 to m do begin
    read(op);
    if op=3 then writeln(H[1])
            else begin
                 read(x);
                 if op=1 then baga(x);
                 if op=2 then scoate(x);
                 end;
end;
close(output);
end.