Cod sursa(job #276281)

Utilizator philipPhilip philip Data 11 martie 2009 00:53:00
Problema Heapuri Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.87 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 (k*2+1<=n) and (h[k*2+1]<h[k*2]) then fiu:=k*2+1;
         if h[fiu]>=h[k] then fiu:=0;
       end;
       if fiu<>0 then begin
         poz[pozz[k]]:=fiu;
         poz[pozz[fiu]]:=k;
         aux:=pozz[k];
         pozz[k]:=pozz[fiu];
         pozz[fiu]:=aux;
         aux:=h[k];
         h[k]:=h[fiu];
         h[fiu]:=aux;
       end;
     until fiu=0;
  end;

procedure sus(n,k:longint);
  var aux,paux:longint;
  begin
    aux:=h[k];
    paux:=pozz[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[paux]:=k;
    pozz[k]:=paux;
  end;

procedure sterge(var n:longint; k:longint);
  var aux:longint;
  begin
    aux:=pozz[n];
    poz[aux]:=k;
    pozz[k]:=aux;
    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;
      poz[p]:=n;
      pozz[n]:=p;
      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.