const n=100;
type TYP_KLIC = integer;
     TYP_HODNOTA = integer;
     INDEX    = 1..n;
     PRVEK    = record KLIC : TYP_KLIC;
                       HODNOTA : TYP_HODNOTA
                end;
     POLE_PRVKU = array [INDEX] of PRVEK;

procedure BOTTOMUP_HEAP_SORT(var H: POLE_PRVKU; n: integer);
var L,R: INDEX;
    X: PRVEK;

  function BIN(I: integer): integer;
  var Pom: integer;
  begin
    Pom:= 0;
    while I<>0 do
    begin
      I:= I shr 1;
      Pom:= Pom + 1;
    end;
    BIN:= Pom;
  end;

  procedure LEAF_SEARCH(L,R: integer; var J: integer);
  begin
    J:= L;
    while 2*J < N do
      if H[2*J].KLIC < H[2*J+1].KLIC then
        J:= J*2
      else
        J:= J*2+1;
    if 2*J = R then
      J:= R;
  end;

  procedure BOTTOM_UP_SEARCH(L: integer; var J: integer);
  begin
    while (L<J) and (H[L].KLIC < H[J].KLIC) do
      J:= J div 2;
  end;

  procedure INTERCHANGE(L,J: integer);
  var X: PRVEK;
      P,K: integer;
  begin
    P:= BIN(J) - BIN(L);
    X:= H[L];
    for K:=P-1 downto 0 do
      H[J shr (K+1)]:= H[J shr K];
    H[J]:= X;
  end;

  procedure BOTTOM_UP_REHEAP(L,R: integer);
  var J: integer;
  begin
    LEAF_SEARCH(L,R,J);
    BOTTOM_UP_SEARCH(L,J);
    INTERCHANGE(L,R);
  end;

begin
  L:= (n div 2)+1;
  R:= n;
  while L>1 do
  begin
    L:= L-1;
    BOTTOM_UP_REHEAP(L,R);
  end;

  while R>1 do
  begin
    X:= H[1];
    H[1]:= H[R];
    H[R]:= X;
    R:= R-1;
    BOTTOM_UP_REHEAP(L,R);
  end;
end;