#include<stdio.h>
#define MAX 500000
#define NIL -1
#define SWAP(type,a,b) { type temp = a; a = b; b = temp; }
typedef struct node{
  int leftid;//親がもっている左側のid
  int rightid;//親がもっている右側のid
  int left;//親がもっている左側のkey
  int right;//親がもっている右側のkey
  int key;//自身のkey
  int id;//自身のid
  int p;//自身の親のkey
  int pid;//自身の親のid

}Node;

void buildMaxHeap(int,int);
void heapsort(int);
Node node[MAX+1];
int main(){
  int n,i,num,l,tmp;
  scanf("%d",&n);
  //初期化
  for(i=1;i<=n;i++){
    node[i].left=NIL;
    node[i].right=NIL;
    node[i].leftid=NIL;
    node[i].rightid=NIL;
    node[i].key=NIL;
    node[i].id=NIL;
    node[i].p=NIL;
    node[i].pid=NIL;
  }
  for(i=1;i<=n;i++){
    //入力の個数の入力
    scanf("%d",&num);
    //根のときの処理
    if(i==1){
      node[i].key=num;
      node[i].id=i;
      tmp=node[i].id;
    }
    //自身から見たときに左側になにも値が入ってないときに行う処理
   else if(node[tmp].leftid==NIL){
     node[i].key=num;
     node[tmp].left=num;
     node[tmp].leftid=i;
     node[i].p=node[i/2].key;//ヒープなのでid自身のidを半分にすると親のidになるのでそのときのkeyを代入している
     node[i].pid=tmp;
    }
     //自身から見たときに右側になにも値が入ってないときに行う処理
   else if(node[tmp].rightid==NIL){
     node[i].key=num;
     node[tmp].right=num;
     node[tmp].rightid=i;
     node[i].p=node[i/2].key;//ヒープなのでid自身のidを半分にすると親のidになるのでそのときのkeyを代入している
     node[i].pid=tmp;
     tmp++;
   }
  }
 
  buildMaxHeap(1,i-1);
  
  for(i=n;i>=1;i--){
    if(i!=1){
    printf("%d ",node[i].key);
    }
    else{
 printf("%d \n",node[i].key);
    }
  }
 
  return 0;
}
void buildMaxHeap(int first,int end){

  int i,j;
  
  for(i=1;i<end;++i){
    j=i;
    while(j>0){
      /*   if(node[j].left<node[j].right){
	  SWAP(int,node[2*j].key,node[(2*j)+1].key);
	  }*/
      if(node[(j+1)/2].key<node[j+1].key){
	SWAP(int,node[(j+1)/2].key,node[j+1].key);
	j=(j-1)/2;
      }else{

	
	break;
      }
    }
  }
  /*  for(i=1;i<=size;i++){
    if((node[i].leftid!=NIL&&node[i].rightid!=NIL)){
      if(node[node[i].rightid].key>node[node[i].leftid].key){
      SWAP(int,node[node[i].leftid].key,node[node[i].rightid].key);
      }
    }
    }*/
    heapsort(end);
}
void heapsort(int p){
    SWAP(int,node[1].key, node[p].key); // 根を後ろに送る
    if(p!=1){
        buildMaxHeap(1,p-1);
    }
    /*        while(1){
	  left = 2*j + 2;
	  right = 2*j + 3;
            if (left >= i) break;
            if (node[left].key > node[k].key) k = left;
            if ((right < i) && (node[right].key > node[k].key)) k = right;
            if (k == j) break;
            SWAP (int,node[k].key, node[j].key);
            j = k;
        }
    */
}
  


