#include #include #include using namespace std; class Heap { vector> data; void shift_up(int i) { int p = (i - 1) / 2; if (data[p] > data[i]) { swap(data[p], data[i]); shift_up(p); } } void shift_down(int i) { int left = i * 2 + 1; int right = i * 2 + 2; if (left >= data.size()) { return; } int to_swap = left; if (right < data.size()) { if (data[right] < data[left]) { to_swap = right; } } if (data[to_swap] < data[i]) { swap(data[i], data[to_swap]); shift_down(to_swap); } } public: void push(int priority, int value) { data.push_back(make_pair(priority, value)); shift_up(data.size() - 1); } void pop() { swap(data[0], data[data.size() - 1]); data.pop_back(); shift_down(0); } void del_by_index(int index) { swap(data[index], data[data.size() - 1]); data.pop_back(); shift_down(index); shift_up(index); } int top() { return data[0].second; } int get_by_index(int index) { return data[index].second; } bool empty() { return data.empty(); } }; int main() { Heap heap; string s; cin >> s; while (s != "exit") { if (s == "push") { int priority, value; cin >> priority >> value; heap.push(priority, value); cout << "ok\n"; } if (s == "pop") { cout << heap.top() << "\n"; heap.pop(); } if (s == "remove") { int index; cin >> index; cout << heap.get_by_index(index) << "\n"; heap.del_by_index(index); } } return 0; }