#include <stdio.h>
#define MAX 500001

void exchange(int *a,int *b){
  int temp;
  temp=*a;
  *a=*b;
  *b=temp;
}

void maxHeapify(int A[],int i,int H){
  int l,r,largest;
  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;
  if (largest != i){ // i の子の方が値が大きい場合
    exchange(&A[i],&A[largest]);
    maxHeapify(A, largest,H); // 再帰的に呼び出し
  }
}
void buildMaxHeap(int A[],int H){
  int i;
  for (i = H/2;i>=1;i--){
    maxHeapify(A,i,H);
  }
}


int main(){
  int a[MAX],h,i;
  scanf("%d",&h);
  for(i=1;i<=h;i++) scanf("%d",&a[i]);
  buildMaxHeap(a,h);
  for(i=1;i<=h;i++) printf(" %d",a[i]);
  printf("\n");
  return 0;
}

