41 static inline int left (
int i) {
return i*2+1; }
42 static inline int right (
int i) {
return (i+1)*2; }
43 static inline int parent(
int i) {
return (i-1) >> 1; }
46 void percolateUp(
int i)
51 while (i != 0 && lt(x, heap[
p])){
62 void percolateDown(
int i)
65 while (left(i) < heap.size()){
66 int child = right(i) < heap.size() && lt(heap[right(i)], heap[left(i)]) ? right(i) : left(i);
67 if (!lt(heap[child], x))
break;
68 heap[i] = heap[child];
78 Heap(
const Comp& c) : lt(c) { }
80 int size ()
const {
return heap.size(); }
81 bool empty ()
const {
return heap.size() == 0; }
82 bool inHeap (
int n)
const {
return n < indices.size() && indices[n] >= 0; }
96 percolateUp(indices[n]);
97 percolateDown(indices[n]); }
103 indices.growTo(n+1, -1);
106 indices[n] = heap.size();
108 percolateUp(indices[n]);
115 heap[0] = heap.last();
116 indices[heap[0]] = 0;
119 if (heap.size() > 1) percolateDown(0);
127 for (i = 0; i < heap.size(); i++)
128 indices[heap[i]] = -1;
131 for (i = 0; i < ns.
size(); i++){
135 for (i = heap.size() / 2 - 1; i >= 0; i--)
142 for (i = 0; i < heap.size(); i++)
143 indices[heap[i]] = -1;