#include <vector>
#include <cstdio>
using namespace std;
class Heap {
private :
vector<int> data;
void reBuildHead();
void reBuildTail();
public:
Heap(){}
~Heap(){}
int pop();
int top();
void push(int value);
};
void Heap::reBuildHead(){
int now = 0;
while(true) {
int lson = now << 1;
int rson = now << 1 | 1;
if (lson >= data.size()) break;
int target = rson >= data.size() ? lson : (data[lson] < data[rson] ? rson : lson);
if (data[now] < data[target]) {
swap(data[now], data[target]);
now = target;
} else {
break;
}
}
}
void Heap::reBuildTail(){
int now = this -> data.size() - 1;
while(true) {
if (now == 0) break;
int father = now >> 1;
if (data[now] > data[father]) {
swap(data[now], data[father]);
now = father;
} else {
break;
}
}
}
int Heap::pop() {
if (data.size() == 0) return NULL;
int ans = data[0];
data[0] = data [data.size() -1];
data.pop_back();
this -> reBuildHead();
return ans;
}
int Heap::top() {
return data.size() == 0 ? NULL : data[0];
}
void Heap::push(int value) {
data.push_back(value);
this -> reBuildTail();
}