#include <iostream>
#include <algorithm>
#include <math.h>
#define MAXN 1010
using namespace std;
int tmp[MAXN];
int a[MAXN];
int N;
//求n个元素的完全二叉树的左子树高
int GetLeftHeight(int n){
//n个元素的二叉树有多少层
int layer,sum;
for(layer=1;layer<=n;layer++){
sum=pow(2,layer)-1;
if(sum>=n) break;
}
//如果最后一层不是满的
int leftSum=0;
if(sum-n){
//在最后一层右半边
if((sum-n)<pow(2,layer-2)) leftSum=pow(2,layer-1)-1;
//在最后一层左半边
else leftSum=n-pow(2,layer-2);
}else{
leftSum=(sum-1)/2;
}
return leftSum;
}
void solve(int ARoot,int TLeft,int TRight){
//通过判断a[ARoot]左子树元素个数,
//判断a[ARoot]是TLeft-TRight区间中第几大的数
int n=TRight-TLeft+1;
if(!n) return;
int K=GetLeftHeight(n);
a[ARoot]=tmp[TLeft+K];
//排序后
//(TLeft+K)左边是小于a[ARoot]的
//(TLeft+K)右边是大于a[ARoot]的
//因此
//左边应填在a[ARoot]的左子树里
//右边应填在a[ARoot]的右子树里
//a[ARoot]左子树根和右子树根
int ALeftRoot =ARoot*2+1;
int ARightRoot=ALeftRoot+1;
solve(ALeftRoot,TLeft,TLeft+K-1);
solve(ARightRoot,TLeft+K+1,TRight);
}
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>tmp[i];
}
sort(tmp,tmp+N);
solve(0,0,N-1);
int flag=0;
for(int i=0;i<N;i++){
if(flag)cout<<" "<<a[i];
else{
cout<<a[i];
flag=1;
}
}
return 0;
}