#include<stdio.h>
#define MAX 500002
#define left (2*(num))
#define right ((2 * num) + 1)
int heaptree[MAX],datanum;

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


void maxheap(int num){
  int largest;
  //leftに値が入るデータ個数でかつ、上にあるヒープツリーよりも左の方が大きい時、左の値を返す。
  if(left <= datanum && heaptree[left] > heaptree[num]){
    largest = left;
  }else largest = num;
  //leftに値が入るデータ個数でかつ、上にあるヒープツリーよりも右の値の方が大きい時、右の値を返す。
  if(left <= datanum && heaptree[right] > heaptree[largest]){
    largest = right;
  }
  //最大値が
  if(largest != num){
    swap(&heaptree[num],&heaptree[largest]);
    maxheap(largest);
  }
}

void print(int a[],int datanum){
  int i;
  for(i=1;i<=datanum;i++){
    printf(" %d",a[i]);
  }
  printf("\n");
}


int main(){
  int i;
  scanf("%d",&datanum);
  //1から初めてデータ個数分配列に挿入する
  for(i=1;i<=datanum;i++){
    scanf("%d",&heaptree[i]);
  }
  //データの個数/2をしてそこから確かめると、子供がいるノードのみチェックすることができる。
  for(i = datanum/2 ;i>=1;i--)maxheap(i);
  print(heaptree,datanum);
  return 0;
}


