#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define nmax 500003
ifstream in("algsort.in");
ofstream out("algsort.out");
/////////////////////////////////////////////////
////////
//////// qsort C library
////////
////////////////////////////////////////////////
int comp(const void *a, const void * b)
{
return *(int*)a - *(int*)b;
}
void qsortC(int *v, int n)
{
qsort(v,n,sizeof(int),&comp);
}
/////////////////////////////////////////////////
////////
//////// mergesort scurt
////////
////////////////////////////////////////////////
const int N = 500000;
int B[N+2];
void merge_sort(int* A,int l, int r)//folosim merge sort in care avem si functia de spargere in jumatatie de intervale si
{ //combinarea intervalelor
int m = (l + r) >> 1, i, j, k;
if (l == r) return;
merge_sort(A,l, m);//spargem in stanga
merge_sort(A,m + 1, r);//spargem in dreapta
for (i=l, j=m+1, k=l; i<=m || j<=r; )
if (j > r || (i <= m && A[i] < A[j]))
B[k++] = A[i++];
else
B[k++] = A[j++];
for (k = l; k <= r; k++) A[k] = B[k];
}
/////////////////////////////////////////////////
////////
//////// mergesort clasic
////////
////////////////////////////////////////////////
void mergeit(int *A, int l , int r)
{
int m =(l+r)/2, i = l, j = m+1, k = l;
while(i <= m && j <= r)
if( A[i]<= A[j])
B[k++] = A[i++];
else
B[k++] = A[j++];
while(i <= m )
B[k++] = A[i++];
while(j <= r )
B[k++] = A[j++];
for(int k = l ; k <= r ; k++)
A[k] = B[k];
}
void mergesort(int *A, int l , int r)
{
if(r - l >=1)
{
int mid = (l+r)/2;
mergesort(A,l,mid);
mergesort(A,mid+1,r);
mergeit(A,l,r);
}
}
int main()
{
int n,i;
in >> n;
int heap[n+1];
for( i = 0 ; i < n ; i++)
in >> heap[i];
//merge_sort(heap,0,n-1);//pozitia primullui element si ultimului element
mergesort(heap,0,n-1);//mergesortul lung
for(int i = 0 ; i < n ; i ++)
out << heap[i] << " ";
return 0;
}