template class Heap { public: bool empty (); void push (T x); void pop (); T top (); private: std::vector data; void reheap (int i); } ; template void Heap::push (T x) { int i = data.size(); data.push_back(x); while (i>0 && data[i]>data[(i-1)/2]) { std::swap(data[i],data[(i-1)/2]); i = (i-1)/2; } } template void Heap::reheap (int i) { int n = data.size(); while (2*i+1data[l])) ? r : l; if (data[k]<=data[i]) break; std::swap(data[k], data[i]); i = k; } } template void Heap::pop () { std::swap(data.front(), data.back()); data.pop_back(); reheap(0); } template T Heap::top () { return data[0]; } template inline bool Heap::empty () { return data.size()==0; }