#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100],n;
void shiftdown(int i)/// 利用二叉树的性质 i 为父亲节点 2i为左孩子 2i+1为右孩子
{
int t,flag=0;
while(i*2<=n && flag==0)
{
if(a[i]>a[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(a[t]>a[i*2+1])
t=i*2+1;
}
if(t!=i)
{
swap(a[t],a[i]);
i=t;
}
else
flag=1;/// 此节点已经调整好
}
}
void create()
{
for(int i=n/2; i>=1; i--)
shiftdown(i);
}
int deletemax()/// 小顶堆 顶端为最小值 输出顶端元素,并将最后一个元素放在堆顶
///再调整为小顶堆再删除 重复此过程
{
int t;
t=a[1];
a[1]=a[n];
n--;
shiftdown(1);
return t;
}
int main()
{
int num;
scanf("%d",&num);
for(int i=1; i<=num; i++)
scanf("%d",&a[i]);
n=num;
create();
for(int i=1; i<=num; i++)
printf("%d ",deletemax());
printf("\n");
return 0;
}