#include<stdio.h>
void maxHeapify(int *,int,int);
void BUILD(int *,int);
int parent(int);
int left(int);
int right(int);
int main(){
  int i,n;
  scanf("%d",&n);
  n++;
  int H[n];
  for(i=1;i<n;i++){
    scanf("%d",&H[i]);
  }
  BUILD(H,n);
  for(i=1;i<n;i++){
    printf(" %d",H[i]);
    printf("\n");
  }
  return 0;
}
void maxHeapify(int *H,int i,int n){
  int l;
  l = left(i);
  int r;
  r = right(i);
  int com,largest;
  // 左の子、自分、右の子で値が最大のノードを選ぶ
  if(l <= n && H[l] > H[i]) largest = l;
  else largest = i;
  if(r <= n && H[r] > H[largest]) largest = r;
  if(largest != i){
    com = H[i];
    H[i] = H[largest];
    H[largest] = com;
    maxHeapify(H, largest,n); // 再帰的に呼び出し
  }
}
void BUILD(int *H,int n){
  int i;
  for(i=n/2;i>0;i--){
    maxHeapify(H,i,n);
  }
}
int parent(int k){
  return (int)((double)k/(double)2);
}
int left(int k){
  return 2*k;
}
int right(int k){
  return 2*k+1;
}
