#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#include <chrono>
#include <map>
typedef unsigned long long ull;
typedef long long ll;
typedef unsigned int uint;
#define endl '\n'
using namespace std;
#if 1
#include <fstream>
ifstream fin("algsort.in");
ofstream fout("algsort.out");
#define cin fin
#define cout fout
#endif
//int k, q;
//int GetSubDiv(int n)
//{
// int p, ans = 0,ansi = 0;
// for (int i = 0;; i++)
// {
// p = k + (1 << 2 * i);
// if (n < p)
// return ansi;
// else
// ans = p,ansi = i;
// }
//}
//bool b = 0;
//int F(int lv,int n)
//{
// int nr = ((1 << lv) * k);
// int div = n / nr;
// int mod = n % nr;
// if (div == 2 || div == 3)
// b = !b;
// if (lv == 0)
// return mod;
// else
// return F(lv - 1, mod);
//}
//char c[100000];
//char Flip(char c)
//{
// if ('A' <= c && c <= 'Z')
// return c + 32;
// else
// return c - 32;
//}
//int main()
//{
// cin >> k >> q;
// cin >> c;
// while (k--)
// {
// int n;
// cin >> n;
// int nrTot = GetSubDiv(n);
// int md = F(nrTot, n);
// cout << ((b == 0) ? c[md] : Flip(c[md]));
// }
//}
int a[500000];
int aux[500000];
void Heap(int st, int dr)
{
int len = dr - st + 1;
if (len == 1)
return;
if (len == 2)
{
if (a[st] > a[dr])
swap(a[st], a[dr]);
return;
}
int k1 = st, k2 = st + len / 2 + 1;
int ln1 = k1 + len / 2;
Heap(k1, ln1);
Heap(k2, dr);
int k = st;
while (k1 <= ln1 && k2 <= dr)
{
if (a[k1] < a[k2])
{
aux[k++] = a[k1];
k1++;
}
else
{
aux[k++] = a[k2];
k2++;
}
}
while (k1 <= ln1)
aux[k++] = a[k1], k1++;
while (k2 <= dr)
aux[k++] = a[k2], k2++;
for (int i = st; i <= dr; i++) // Copiere
a[i] = aux[i];
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
Heap(0, n-1);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
}