#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <time.h>
using namespace std;
#define ROOT 1
#define FATHER(i) ((i)/2)
#define LEFT(i) ((i)*2)
#define RIGHT(i) ((i)*2+1)
#define cmp >
typedef struct PriorityQueue{
int *__data,*data;
int size,n;
}PriorityQueue;
PriorityQueue *initPQ(int size){
PriorityQueue *p=(PriorityQueue*)malloc(sizeof(PriorityQueue));
p->__data=(int*)malloc(sizeof(int)*size);
p->data=p->__data-ROOT;
p->size=size;
p->n=0;
return p;
}
void clearPQ(PriorityQueue *p){
if(!p)return ;
free(p->__data);
free(p);
return ;
}
int _empty(PriorityQueue *p){
return p->n==0;
}
int full(PriorityQueue *p){
return p->n==p->size;
}
int top(PriorityQueue *p){
return p->data[ROOT];
}
void up_updata(int *data,int i){
cout<<endl<<"up "<<data[i]<<endl;
if(i==ROOT)return ;
if(data[i] cmp data[FATHER(i)]){
swap(data[i],data[FATHER(i)]);
up_updata(data,FATHER(i));
}
cout<<endl;
return ;
}
void down_updata(int *data,int i,int n){
cout<<endl<<"down "<<data[i]<<endl;
while(LEFT(i)<=n){
int ind=i,l=LEFT(i),r=RIGHT(i);
if(data[l] cmp data[ind])ind=LEFT(i);
if(r<=n&&data[r] cmp data[ind])ind=r;
if(ind==i)break;
swap(data[i],data[ind]);
i=ind;
}
cout<<endl;
return ;
}
int push(PriorityQueue *p,int x){
if(full(p))return 0;
p->n+=1;
p->data[p->n]=x;
up_updata(p->data,p->n);
return 1;
}
int pop(PriorityQueue *p){
if(_empty(p))return 0;
p->data[ROOT]=p->data[p->n];
p->n-=1;
down_updata(p->data,ROOT,p->n);
return 1;
}
void output(PriorityQueue *p){
cout<<"pq: "<<p->n<<" ";
for(int i=1;i<=p->n;i++){
cout<<p->data[i]<<" ";
}
cout<<endl;
return ;
}
int main(){
#define MAX_OP 100
PriorityQueue *p=initPQ(MAX_OP);
int op,x;
while(cin>>op){
if(op==1){
cin>>x;
cout<<x<<" insert:"<<endl;
push(p,x);
output(p);
}else{
cout<<"top"<<top(p)<<endl;
pop(p);
output(p);
}
}
clearPQ(p);
return 0;
}