Реализация двоичной кучи
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;