template<class T>
struct Priority_queue{
T *a;
void init(){
num = 0;
}
Priority_queue(int n=1100000){
a = new T[n];
num = 0;
}
int num;
int size(){
return num;
}
void push(const T &x){
num+=1;
a[num] = x;
int k = num;
while(k>1){
int p = k/2;
if(a[k]<a[p]){
T temp = a[k];
a[k] = a[p];
a[p] = temp;
k = p;
}
else
break;
}
}
bool empty(){
if(num<=0)
return 1;
else
return 0;
}
T top(){
return a[1];
}
T pop(){
T key = a[1];
a[1] = a[num];
num -=1;
int pt = 1;
while(pt<=num){
int pr;
if(a[pt*2+1]<a[pt*2]){
pr = pt*2+1;
}
else
pr = pt*2;
if(a[pr]<a[pt]){
T temp = a[pr];
a[pr] = a[pt];
a[pt] = temp;
pt = pr;
}
else
break;
}
return key;
}
};