const max = 1000;

type
   // kuhjas hoitavate elementide tüüp
   elem = record
      voti : longint; // võti, mille järgi järjestatakse
      // siin võiks olla muud andmed, mida vaja kaasas kanda
   end;
   // kuhjamassiivi tüüp
   mass = array [1..max] of elem;

// vahetab kahe elemendi väärtused
procedure vaheta(var a : mass; i, j : longint);
var t : elem;
begin
   t := a[i]; a[i] := a[j]; a[j] := t;
   // vajaduse korral saaks siin muuta ka mingis välises
   // indeksis olevaid viiteid elemendidele a[i] ja a[j]
end;

// viib elemendi kuhjas ülespoole tema õigele kõrgusele
procedure ules(var a : mass; i : longint);
var j : longint;
begin
   while i > 1 do begin
      j := i div 2;
      if a[i].voti > a[j].voti then begin
         vaheta(a, i, j);
         i := j;
      end else
         i := 1; // väljume
   end;
end;

// viib elemendi kuhjas allapoole tema õigele kõrgusele
procedure alla(var a : mass; i, n : longint);
var j : longint;
begin
   while i < n do begin
      j := i;
      if 2 * i <= n then
         if a[j].voti < a[2 * i].voti then
            j := 2 * i;
      if 2 * i + 1 <= n then
         if a[j].voti < a[2 * i + 1].voti then
            j := 2 * i + 1;
      if j > i then begin
         vaheta(a, i, j);
         i := j;
      end else
         i := n; // väljume
   end;
end;

// sorteerib massiivi kuhjameetodil
procedure sordi(var a : mass; n : longint);
var i : longint;
begin
   // muudame kuhjaks
   for i := 1 to n do
      ules(a, i);
   // sorteerime kuhjast võtmisega
   for i := n downto 1 do begin
      vaheta(a, 1, i);
      alla(a, 1, i - 1);
   end;
end;


// testime
var a : mass; n, i : longint;
begin
   for n := 1 to max do begin
      for i := 1 to n do
         a[i].voti := random(n);
      sordi(a, n);
      for i := 2 to n do
         if a[i - 1].voti > a[i].voti then
            writeln(n, ' ', i);
   end;
end.
