#include <fstream.h>
ifstream f("algsort.in");
ofstream g("algsort.out");
const int Nmax=500001;
void readV(int &n,int v[Nmax]){
f>>n;
for(int i=0;i<n;i++) f>>v[i];
}
void output(int n,int v[Nmax]){
for(int i=0;i<n;i++) g<<v[i]<<" ";
g<<'\n';
}
void output(int n){
g<<n<<'\n';
}
void sort(int n,int v[Nmax]){
int i,j,t;
readV(n,v);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (v[i]>v[j]) {t=v[i],v[i]=v[j],v[j]=t;}
}
void InsertSort(int &n,int v[Nmax]){
f>>n;
int N=1,j,num;
for(int i=0;i<n;i++){
f>>num;
j=N-1;
while (j>0 && v[j-1]>num) {v[j]=v[j-1];j--;}
v[j]=num;
N++;
}
}
void SelSort(int &n,int v[Nmax]){
//int Nmax=50001;
int a[Nmax],m[Nmax],p_min,p_minB=0,nA=0,i,j;
readV(n,v);
for(i=0;i<n+1;i++) m[i]=0;
for(i=0;i<n;i++){
p_min=p_minB;
while (m[p_min]==-1) p_min++;
p_minB=p_min;
for(j=p_min+1;j<n;j++)
if (m[j]!=-1 && v[j]<v[p_min]) p_min=j;
a[nA++]=v[p_min];m[p_min]=-1;
}
for(i=0;i<n;i++) v[i]=a[i];
}
void Merge(int v[Nmax],int init,int fin){
int a[fin-init+1],n_adaugat=0;
int div=(init+fin)/2;
int cs=init,cd=div+1;
while (cs<=div && cd<=fin){
if (v[cs]<v[cd]) a[n_adaugat]=v[cs++];
else a[n_adaugat]=v[cd++];
n_adaugat++;
// output(n_adaugat,a);
}
// output(n_adaugat,a);
while (cs<=div) a[n_adaugat++]=v[cs++];
while (cd<=fin) a[n_adaugat++]=v[cd++];
for(int i=0;i<n_adaugat;i++)
v[i+init]=a[i];
}
void MergeSort(int v[Nmax],int init,int fin){
if (init==fin) return;
else { MergeSort(v,init,(fin+init)/2);
MergeSort(v,(fin+init)/2+1,fin);
Merge(v,init,fin);
}
}
int main(){
int n,v[Nmax],i;
//sort(n,v);
//InsertSort(n,v);
//SelSort(n,v);
//readV(n,v);
//Merge(v,3,6);
readV(n,v);
MergeSort(v,0,n-1);
for(i=0;i<n;i++) g<<v[i]<<" ";
return 0;
}