#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
//动态的维护一个大顶堆 支持 添加数据 和删除堆顶数据 并且总保持有序状态
//数组从a[1] 开始
void addAdjust(int *a,int size)
{
int id = size;
while(id/2!=0&&a[id]>a[id/2])
{
swap(a[id],a[id/2]);
printf("%d %d\n",a[id],a[id/2]);
id = id/2;
}
}
//删除堆顶元素
void deleteAdjust(int *a,int size)
{
int id = 1;
a[id] = 0;
while(id<=size/2)
{
int lchild = id*2<size?id*2:0;
int rchild = id*2+1<size?id*2+1:0;
if(lchild*rchild)
{
if(a[lchild]>a[rchild])
{
swap(a[lchild],a[id]);
id = lchild;
}
else
{
swap(a[rchild],a[id]);
id = rchild;
}
}
else if(lchild)
{
swap(a[lchild],a[id]);
id = lchild;
break ;
}
else
{
break ;
}
}
//一旦 跑到的位置不是最后位置
if(id!=size)
{
a[id] = a[size];
while(a[id]>a[id/2])
{
swap(a[id],a[id/2]);
id = id/2;
}
}
}
void heapAdjust(int *a,int i,int size)
{
int lchild = 2*i;
int rchild = 2*i+1;
int max = i;
if(i<=size/2)
{
if(lchild<=size&&a[lchild]>a[max])
{
max = lchild;
}
if(rchild<=size&&a[rchild]>a[max])
{
max = rchild;
}
if(max!=i)
{
swap(a[max],a[i]);
heapAdjust(a,max,size);
}
}
}
void buildHeap(int *a,int size)
{
for(int i= size/2;i>=1;i--)
{
heapAdjust(a,i,size);
}
}
void heapSort(int *a,int size)
{
buildHeap(a,size);
for(int i=size;i>=1;i--)
{
swap(a[1],a[i]);
//cout<<a[1]<<" ";
heapAdjust(a,1,i-1);
}
}
int main()
{
int a[100];
int size = 0;
int data;
char s[1];
while(scanf("%s",s)!=EOF)
{
if(s[0]=='a')
{
scanf("%d",&data);
a[++size] = data;
addAdjust(a,size);
}
if(s[0]=='d')
{
deleteAdjust(a,size);
size--;
}
if(s[0]=='p')
{
for(int i=1;i<=size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
heapSort(a,size);
for(int i=1;i<=size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
}
return 0;
}