Cod sursa(job #276251)

Utilizator philipPhilip philip Data 10 martie 2009 23:57:10
Problema Heapuri Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 1.76 kb
var f,g:text;
    i,nr,n,p,x:longint;
    op:byte;
    h:array[1..200000] of longint;
    poz,pozz:array[1..200000] of longint;

function tata(i:longint):longint;
  begin
    tata:=i div 2;
  end;

function fiust(i:longint):longint;
  begin
    fiust:=i*2;
  end;

function fiudr(i:longint):longint;
  begin
    fiudr:=i*2+1;
  end;

procedure jos(n,k:longint);
  var fiu,aux:longint;
  begin
     repeat
       fiu:=0;
       if k*2<=n then begin
         fiu:=k*2;
         if (fiudr(k)<=n) and (h[fiudr(k)]<h[k*2]) then fiu:=k*2+1;
         if h[fiu]>=h[k] then fiu:=0;
       end;
       if fiu<>0 then begin
         aux:=poz[fiu];
         poz[fiu]:=poz[k];
         poz[k]:=aux;
         aux:=pozz[fiu];
         pozz[fiu]:=pozz[k];
         pozz[k]:=aux;
         aux:=h[k];
         h[k]:=h[fiu];
         h[fiu]:=aux;
       end;
     until fiu=0;
  end;

procedure sus(n,k:longint);
  var aux:longint;
  begin
    aux:=h[k];
    while ((k>1) and (aux<h[k div 2])) do begin
      h[k]:=h[k div 2];
      poz[pozz[k div 2]]:=k;
      pozz[k]:=pozz[k div 2];
      k:=k div 2;
    end;
    h[k]:=aux;
    poz[p]:=k;
    pozz[k]:=p
  end;

  procedure sterge(var n:longint; k:longint);
  begin
    h[k]:=h[n];
    n:=n-1;
    if ((k>1) and (h[k]<h[k div 2])) then
      sus(n,k) else jos(n,k);
  end;

BEGIN
  assign(f,'heapuri.in');
  reset(f);
  assign(g,'heapuri.out');
  rewrite(g);
  readln(f,nr);

  for i:=1 to nr do begin
    read(f,op);

    if op=1 then begin
      n:=n+1;
      read(f,h[n]);
      p:=p+1;
      sus(n,n);
    end else
      if op=2 then begin
        read(f,x);
        sterge(n,poz[x]);
      end else begin
        writeln(g,h[1]);
      end;
  end;
  close(g);
END.