#include <stdio.h>

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

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

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

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

  /* とりあえず、配列Aに値を入れる */
  for(i = 1;i < h+1; i++){
    scanf("%d",&key);
    A[i] = key;
  }

  buildMaxHeap(A);

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

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

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

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

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

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