#include #include #include using namespace std; class MaxHeap { public: int top() const; bool empty() const; void pop(); void push(int value); private: vector heap; void siftUp(int index); void siftDown(int index); }; int MaxHeap::top() const { return heap[0]; } bool MaxHeap::empty() const { return heap.size() == 0; } void MaxHeap::push(int value) { heap.push_back(value); siftUp(heap.size() - 1); } void MaxHeap::pop() { heap[0] = heap.back(); heap.pop_back(); siftDown(0); } void MaxHeap::siftUp(int index) { while (index > 0) { int parent = (index - 1) / 2; if (heap[index] > heap[parent]) { swap(heap[index], heap[parent]); index = parent; } else { break; } } } void MaxHeap::siftDown(int index) { while (index * 2 + 1 < heap.size()) { int child1 = index * 2 + 1; int child2 = index * 2 + 2; int largest = index; if (child1 < heap.size() && heap[child1] > heap[largest]) { largest = child1; } if (child2 < heap.size() && heap[child2] > heap[largest]) { largest = child2; } if (largest != index) { swap(heap[index], heap[largest]); index = largest; } else { break; } } } int main() { MaxHeap q; q.push(5); q.push(10); q.pop(); printf("%d\n", q.top()); return 0; }