#include<iostream>
using namespace std;
struct node{
int data;//结点的内容
int left;//左子树
int right;//右子树
int size;//子树大小,含本结点
int cnt; //相同内容的个数
} Bst[100100];
int a[100010];
int root=0;
int tot=0;
//插入x的值
void insert(int &r,int x)
{
if (r==0)
{
tot++;
r=tot;
Bst[tot].data=x;
Bst[tot].left=0;
Bst[tot].right=0;
Bst[tot].size=1;
Bst[tot].cnt=1;
}
else
{
Bst[r].size++;
if(x>Bst[r].data)
{
insert(Bst[r].right,x);
}
else if(x<Bst[r].data)
{
insert(Bst[r].left,x);
}
else
{
Bst[r].cnt++;
}
}
}
//中序遍历
void inOrder(int r)
{
if (r==0) return ;
inOrder(Bst[r].left);
for (int i=0;i<Bst[r].cnt;i++) cout<<Bst[r].data<<" ";
inOrder(Bst[r].right);
}
void build(int l,int r)
{
if (r-l<1) return ;
int m;
m=(l+r)/2;
insert(root,a[m]);
build(l,m);
build(m+1,r);
}
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i];
}
build(0,n);
inOrder(root);
}