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; } };