#include<iostream>
#include<vector>
#include<string.h>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
#define LL long long
const int Max = 200000;
int a[Max];
void sift(int l,int r)
{
int x=l;
while(x*2<=r){
int k=2*x;
if(2*x+1<=r&&a[2*x]<a[2*x+1]){
k=2*x+1;
}
if(a[k]<=a[x]) break;
swap(a[k],a[x]);
x=k;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=n/2;i>=1;i--){
sift(i,n);
}
for(int i=n;i>=2;i--){
swap(a[1],a[i]);
sift(1,i-1);
}
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 1000000+4;
#define lt (x<<1)
#define rt (x<<1|1)
int a[maxn];
int sz,n;
void up(int x)//上浮
{
while(x>1){
if(a[x/2]>a[x]){
swap(a[x/2],a[x]);
x=x/2;
}else
break;
}
}
void down()//下沉
{
swap(a[1],a[sz]);
sz--;
int x=1;
while(lt<=sz){
int k=lt;
int min=a[lt];
if(rt<=sz&&a[rt]<min){
min=a[rt];
k=rt;
}
if(a[x]<min) break;
else{
swap(a[x],a[k]);
x=k;
}
}
}
int main()
{
int n;
scanf("%d",&n);
sz=n;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) up(i);
for(int i=1;i<=n;i++){
down();
}
for(int i=1;i<=n;i++){
printf("%d%c",a[i],i==n?'\n':' ');
}
}