#include <fstream>
using namespace std;
int v[500010], n, c, p, i;
int main () {
ifstream fin ("algsort.in");
ofstream fout("algsort.out");
fin>>n;
for (i=1;i<=n;i++)
fin>>v[i];
for (i=2;i<=n;i++) {
/// inserez pe v[i] in heapul deja existent cu primele i-1 elemente
c = i;
p = c/2;
while(p >= 1 && v[c] > v[p]) {
swap(v[c], v[p]);
c = p;
p = c/2;
}
}
for (i=n; i>=2; i--) {
swap(v[1], v[i]);
/// corectez heapul cu i-1 elemente stricat doar de radacina
p = 1;
c = 2;
while (c <= i-1) {
if (c+1 <= i-1 && v[c+1] > v[c])
c++;
if (v[p] < v[c]) {
swap(v[p],v[c]);
} else
break;
p = c;
c = 2*p; /// initial, dar si la o mutare ma asez pe fiul stang intai
}
}
for(i=1;i<=n;i++)
fout<<v[i]<<" ";
return 0;
}