#include<stdio.h>
#include<math.h>
void print(int*,int);
void divide(int*,int,int);
void conquer(int*,int,int,int);
int main(){
int size;
scanf("%d",&size);//讀入串列大小
int arr[size];
for(int i=0;i<size;i++){//將資料放入串列
scanf("%d",&arr[i]);
}
int l=0,r=size-1;
divide(arr,l,r);
print(arr,size);//印出來
}
void print(int*arr,int size){
for(int i=0;i<size;i++){
printf("%d",arr[i]);
printf(" ");
}
printf("\n");
}
void divide(int*arr,int l,int r){
int mid;
if(l<r){//代表data還沒切割到最後一個
mid=(l+r)/2;
divide(arr,l,mid);
divide(arr,mid+1,r);
conquer(arr,l,mid,r);
}
}
void conquer(int*arr,int l,int mid,int r){
int t1=(mid-l+1);
int t2=(r-mid);
int temp1[t1];
int temp2[t2];
//宣告出兩個陣列將資料存入
for(int i=0;i<t1;i++){
temp1[i]=arr[l+i];
}
for(int j=0;j<t2;j++){
temp2[j]=arr[mid+j+1];
}
int i=0;//代表temp1陣列起始
int j=0;//代表temp2陣列起始
int initial=l;//代表原始陣列的index
while(i<t1&&j<t2){//代表各arr有大於一個data
if(temp1[i]<=temp2[j]){
arr[initial]=temp1[i];
i++;
}
else if(temp1[i]>temp2[j]){
arr[initial]=temp2[j];
j++;
}
initial++;//無論怎樣原始陣列都會讀入一個較小的值且往前
}
while(i<t1){//當陣列一邊為空
arr[initial]=temp1[i];
i++;
initial++;
}
while(j<t2){
arr[initial]=temp2[j];
j++;
initial++;
}
}