#include <stdio.h>

typedef struct {
  int key;
  int parent;
  int left;
  int right;
} heap;

heap A[500000];
int h; /* ヒープサイズ */

void maxHeapify(heap*, int);
void buildMaxHeap(heap*);

int main()
{
  int i,key;
  
  scanf("%d",&h); /* ヒープのサイズ */

  /* 初期化 */
  for(i = 0;i < h+1;i++){
    A[i].key = -2000000001;
    A[i].parent = -2000000001;
    A[i].left = -2000000001;
    A[i].right = -2000000001;
  }

  /* とりあえず、配列Aに値を入れる */
  for(i = 1;i < h+1; i++){
    scanf("%d",&key);
    A[i].key = key;
  }
  for(i = 1;i < h+1; i++){
    A[i].parent = A[i/2].key; /* 親の設定 */
    if((2*i) < h+1) A[i].left = A[2*i].key; /* 左の設定 */
    if((2*i+1) < h+1) A[i].right = A[2*i+1].key; /* 右の設定 */
  }

  buildMaxHeap(A);

  /* 出力 */
  for(i = 1;i < h+1;i++){
    printf(" %d",A[i].key);
  }
  printf("\n");
  return 0;
}

void maxHeapify(heap *A,int i)
{
  int l,r,largest,num;

  l = 2*i;
  r = 2*i+1;

  /* 左の子、自分、右の子で値が最大のノードを選ぶ */
  if(l <= h && A[l].key > A[i].key) largest = l; /* 左の子が自分より大きい場合 */
  else largest = i; /* 自分が左の子より大きい場合 */

  if(r <= h && A[r].key > A[largest].key) largest = r; /* 右の子がlargestより大きい場合 */
  
  if(largest != i){ // iの子の方が値が大きい場合
    num = A[i].key;     // A[i]とA[largest]を交換
    A[i].key = A[largest].key;
    A[largest].key = A[i].key;
    maxHeapify(A,largest); //再帰的に呼び出し
  }
}

void buildMaxHeap(heap *A)
{
  int i;
  for(i = h/2 ;i >= 1; i--){
    maxHeapify(A,i);
  }
}