
program heapsort;

type heap=record
            h: array of integer;
            e:integer;
          end;

procedure heap_new(var h:heap;
                   size:integer);
begin
        h.e:= 0;
        setlength(h.h,size);
end;

function heap_empty(h:heap):boolean;
begin
        heap_empty:=h.e = 0;
end;

procedure heap_dispose(var h:heap);
begin
        setlength(h.h,0);
        h.e:=0;
end;

function heap_min(h:heap):integer;
begin
        heap_min:=h.h[0];
end;

procedure heap_add(var h:heap; value:integer);
var
        index,p:integer;
begin
        h.h[h.e]:=value;
        index:=h.e;
        inc(h.e);
        while index<>0 do
        begin
              p:= (index-1) div 2;
              if h.h[p] <= h.h[index] then break;
              swap(h.h[p],h.h[index]);
              index:=p;
        end;
end;

procedure heap_pop(var h:heap);
var
        i,l,p:integer;

begin
        dec(h.e);
        h.h[0] := h.h[e];
        i := 0;
    
        while true do
        begin
                l := (i*2)+1;
                p := (i*2)+2;
                if l >=e then break
                if p = e then begin
                if h.h[l]< h.h[i] then swap(h.h[l],h.h[i]);
                end;
        end;
        
end;

begin
end.
