template <typename Key, typename Element, typename Comp>
void HeapPriorityQueue<Key, Element, Comp>::
insertItem(const Key& k, const Element& e) { // insert key-element
Position z = T.add(Item(k, e));
while (!T.isRoot(z)) { // up-heap bubbling
Position u = T.parent(z);
if (comp(key(u), key(z)) <= 0) break;
T.swapElements(u, z);
z = u;
}
}
template <typename Key, typename Element, typename Comp>
void HeapPriorityQueue<Key, Element, Comp>::
removeMin() // remove minimum
throw(EmptyContainerException) {
if (isEmpty())
throw EmptyContainerException("Removal from empty queue");
if (size() == 1)
T.remove();
else {
T.replaceElement(T.root(), T.remove());
Position r = T.root();
while (T.isInternal(T.leftChild(r))) { // down-heap bubbling
Position s = T.rightChild(r);
if (T.isExternal(T.rightChild(r)) ||
comp(key(T.leftChild(r)), key(T.rightChild(r))) <= 0)
s = T.leftChild(r);
if (comp(key(s), key(r)) < 0) {
T.swapElements(r, s);
r = s;
}
else break;
}
}
}