int len = 0;
vector<int> heap = {0};
void init(vector<int> h) {
len = 0;
h.clear();
h.push_back(0);
}
void put(int x) {
len++;
heap.push_back(x);
int son = len;
while ( son != 1 && heap[son/2] > heap[son]) {
int tmp = heap[son/2];
heap[son/2] = heap[son];
heap[son] = tmp;
son = son / 2 ;
}
}
int del() {
if (len == 0) {
return 0;
}
int res = heap[1];
heap[1] = heap[len];
heap.pop_back();
len--;
int fa = 1;
int son = 2;
while (fa <= len/2 || fa*2+1 <= len) {
son = fa * 2;
if ((fa*2+1) > len || heap[fa*2] < heap[fa*2+1]) {
son = fa*2;
} else {
son = fa * 2 + 1;
}
if (heap[fa] > heap[son]) {
swap(heap[fa], heap[son]);
fa = son;
} else {
break;
}
}
return res;
}
put是向堆中插入元素,del是取出最小(堆顶)的元素。