#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int Cmp(constvoid* a,constvoid* b);voidLevelTraversal(int*CBT, int N);
int*CreatCBT(int*T, int N);voidRe_CBT(int*CBT, int target, int*T, int left, int right);
int Min(int a, int b);
int Log2(int K);
int main(){
int N;//number of CBTnodescanf("%d",&N);
int*T=(int*)malloc(N*sizeof(int));
int i;for(i =0; i <N; i++)scanf("%d",&T[i]);qsort(T,N,sizeof(int), Cmp);
int*CBT=CreatCBT(T,N);LevelTraversal(CBT,N);return0;}
int Cmp(constvoid* a,constvoid* b){return*(int*)a -*(int*)b;}voidLevelTraversal(int*CBT, int N){
int i, flag =1;for(i =1; i <N+1; i++){if(flag) flag =0;elseprintf(" ");printf("%d",CBT[i]);}}
int*CreatCBT(int*T, int N){
int*CBT=(int*)malloc((N+1)*sizeof(int));Re_CBT(CBT,1,T,0,N-1);returnCBT;}voidRe_CBT(int*CBT, int target, int*T, int left, int right){if(left > right)return;
int N= right - left +1;//number of T
int nl;//number of left tree
int h;//height of perfect tree
int x;//number of surplus
h =Log2(N+1);
x =Min(N-(int)pow(2, h)+1,(int)pow(2, h -1));
nl =(int)pow(2, h -1)-1+ x;CBT[target]=T[left+nl];Re_CBT(CBT, target *2,T, left, left + nl -1);Re_CBT(CBT, target *2+1,T, left + nl +1, right);}
int Min(int a, int b){return a < b ? a : b;}
int Log2(int K){
int exp =0;while(pow(2, exp)<=K) exp++;return--exp;}