参照jjh神犇
struct Heap{
Node W[M];
int sz;
void Heap(){sz=0;}
void push(Node x){
int p=++sz,q;
while(q=p>>1){
if(x<W[q]) W[p]=W[q],p=q;
else break;
}
W[p]=x;
}
void pop(){
int p=1,q;
Node x=W[sz--];
while((q=p<<1)<=sz){
if(q<sz && W[q|1]<W[q]) q|=1;
if(W[q]<x) W[p]=W[q],p=q;
else break;
}
W[p]=x;
}
inline Node top(){return W[1];}
inline bool empty(){return sz==0;}
}Q;