#include<stdio.h>
#define MAX 50000
#define NIL 0

/*木*/
int Tree[MAX];

/*プロトタイプ宣言*/
void buildMaxHeap(void);
void maxHeapify(int);

/*グローバル変数*/
int heap_size;


main() {
  int i;//counter

  scanf("%d", &heap_size);

  for(i = 1; i <= heap_size; i++) {
    scanf("%d", &Tree[i]);
  }

  buildMaxHeap();

  for(i = 1; i <= heap_size; i++) {
    printf(" %d", Tree[i]);
  }
  printf("\n");

}


/*
 *    buildMaxHeap関数...iの値を変化させ、ボトムアップで適用させることでmax-heap変換に繋げる
 */
void buildMaxHeap() {

  int i;//counter

  //始めにheap_sizeを2で割る事で構造体ではなく配列でmax-heapを適用させることができる。
  for(i = (heap_size/2); i >= 1; i--) {

    maxHeapify(i);
  }

}



/*
 *    maxHeapify関数...max-heapを行う関数。コメントは随時記載。
 */
void maxHeapify(int u) {

  int left;
  int right;
  int largest;
  int tmp=0;//保存用関数

  //右と左の仕分け。
  left = 2*u;
  right = 2*u +1;

  //左の値が制限内かつ、元々の数より大きければ最大の値として保存する。...1
  if(left <= heap_size && Tree[left] > Tree[u]) {
    largest = left;
  }

  /**/
  else {
    largest = u;
  }

  //1と同じ要領。順番は左→右なのでここで比較するのは右の値。
  if(right <= heap_size && Tree[right] > Tree[largest]) {
    largest = right;
  }

  /**/
  if(largest != u) {
    tmp = Tree[u];
    Tree[u] = Tree[largest];
    Tree[largest] = tmp;

    //buildMaxHeap関数が終わるまで続ける（再起？）
    maxHeapify(largest);
  }

}