class Heap {
public:
vector<int> a;
int n =0;
//下沉
void sink(int i){
int j =0;
int t = a[0];
//找到i结点的左子节点
while ((j=(i<<1) +1)<n) {
/*
j < n-1 判断是否有右子节点
如果有并且右子结点更大 那么
j指向右子结点
*/
if (j< n-1 && a[j]<a[j+1]) {
j++;
}
//如果子结点比t大 那么t的位置还需要往后排
if (a[j] > t) {
a[i] = a[j];
i=j;
}else{
//找到t的位置 此时t是大于所有的子节点
break;
}
}
//将t放在找到的位置哪里
a[i] = t;
}
//上浮
void swim(int i){
int par = 0;
int t = a[i];
//如果还存在父结点
while (i>0) {
par = (i-1) >>1;
//如果父结点比t值小
if (a[par] < t) {
a[i] = a[par];
i = par;
}else{
break;
}
}
a[i] = t;
}
/*
往堆的尾巴a[n]上添加新来的元素;新来元素 a[n] 进行上浮的操作
*/
void push(int x){
a[n++] = x;
swim(n-1);
}
int pop(){
//取出 a[0] 的值作为返回值
int ret = a[0];
//然后将 a[n-1] 存放至 a[0]
a[0] = a[--n];
//将 a[0] 进行下沉操作
sink(0);
return ret;
}
int size() const {return n;}
};