Реализация двоичной кучи

var
  heap, place : array[1 .. MaxN] of integer;    //place[i] обозначает место i-ой системы в куче
  hs : integer; // размер кучи

//"Всплывание" n-ого элемента кучи

procedure siftup(n : integer);
var
  t : integer;
begin
  if n = 1 then exit;
  if heap[n] > heap[n div 2] then begin
    t := heap[n];
    heap[n] := heap[n div 2];
    heap[n div 2] := t;
    place[heap[n]] := n;
    place[heap[n div 2]] := n div 2;
    siftup(n div 2);
  end;
end;

//"Утопление" s-ого элемента в куче

procedure sift_down(s : integer);
var
  l, r, max, t : integer;
begin
  l := s * 2;
  r := s * 2 + 1;
  max := s;
  if (l <= hs) and (heap[l] > heap[max]) then max := l;
  if (r <= hs) and (heap[r] > heap[max]) then max := r;
  if s <> max then begin
    t := heap[s];
    heap[s] := heap[max];
    heap[max] := t;
    place[heap[s]] := s;
    place[heap[max]] := max;
    sift_down(max)
  end;
end;

// Удаление n-го элемента из кучи

procedure del(n : integer);
var t : integer;
begin
  t := heap[n];
  heap[n] := heap[hs];
  heap[hs] := t;
  place[heap[n]] := n;
  dec(hs);
  sift_down(n);
end;

//Добавление элемента x в кучу

procedure ins(x : integer);
begin
  inc(hs);
  heap[hs] := x;
  place[x] := hs;
  siftup(hs);
end;