void upheap(int *h, int k) { int v = h[k]; while (k/2 > 0 && h[k/2] < v) { h[k] = h[k/2]; k = k/2; } h[k] = v; } void insert(int *h, int *pn, int v) { h[++*pn] = v; upheap(h, *pn); } void downheap(int *h, int n) { int v = h[1], k = 1, j; while (k <= n/2) { j = 2 * k; if (j < n && h[j] < h[j + 1]) j++; if (v > h[j]) break; h[k] = h[j]; k = j; } h[k] = v; } int delete(int *h, int *pn) { int v = h[1]; h[1] = h[(*pn)--]; downheap(h, *pn); return v; }