#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int da[400000];
struct tree{
int l,r,k;
tree(){
l=r=k=0;
}
}a[400000];
int n,cnt;
void insert(int s,int p){
if(a[p].k>s){
if(a[p].l==0){
a[p].l=++cnt;
a[cnt].k=s;
}
else insert(s,a[p].l);
}
else{
if(a[p].r==0){
a[p].r=++cnt;
a[cnt].k=s;
}
else insert(s,a[p].r);
}
return;
}
void output(int p){
if(a[p].l)output(a[p].l);
printf("%d ",a[p].k);
if(a[p].r)output(a[p].r);
return;
}
int main(void){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&da[i]);
a[1].k=da[1];
cnt=1;
for(i=2;i<=n;i++)
insert(da[i],1);
output(1);
return 0;
}
#include<cstdio>
#include<cstdlib>
using namespace std;
int da[400000];
struct tree{
int l,r,k;
tree(){
l=r=k=0;
}
}a[400000];
int n,cnt;
void insert(int s,int p){
if(a[p].k>s){
if(a[p].l==0){
a[p].l=++cnt;
a[cnt].k=s;
}
else insert(s,a[p].l);
}
else{
if(a[p].r==0){
a[p].r=++cnt;
a[cnt].k=s;
}
else insert(s,a[p].r);
}
return;
}
void output(int p){
if(a[p].l)output(a[p].l);
printf("%d ",a[p].k);
if(a[p].r)output(a[p].r);
return;
}
int main(void){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&da[i]);
a[1].k=da[1];
cnt=1;
for(i=2;i<=n;i++)
insert(da[i],1);
output(1);
return 0;
}