#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define NMAX 500006
int n,tata[NMAX],stanga[NMAX],dreapta[NMAX],p[NMAX];
int nr_elemente[NMAX],v[NMAX],radacina;
void insert(int nod,int nod_nou)
{
if(nod == nod_nou)
return ;
if(v[nod_nou] < v[nod])
{
if(!stanga[nod])
{
tata[nod_nou] = nod;
stanga[nod] = nod_nou;
}
insert(stanga[nod], nod_nou);
}
else
{
if(!dreapta[nod])
{
tata[nod_nou] = nod;
dreapta[nod] = nod_nou;
}
insert(dreapta[nod], nod_nou);
}
}
inline int sift(int nod)
{
// printf("Nodul %d\n",nod);
if(!tata[nod] || p[nod] <= p[tata[nod]])
return 0;
int father = tata[nod];
tata[nod] = tata[father];
if(stanga[tata[nod]] == father)
stanga[tata[nod]] = nod;
else
dreapta[tata[nod]] = nod;
if(stanga[father] == nod)
{
stanga[father] = dreapta[nod];
dreapta[nod] = father;
}
else
{
dreapta[father] = stanga[nod];
stanga[nod] = father;
}
tata[father] = nod;
// printf("%d %d %d %d %d %d %d %d\n",nod,tata[nod],stanga[nod],dreapta[nod],father,tata[father],stanga[father],dreapta[father]);
return 1;
}
void dfs(int nod)
{
if(!nod)
return ;
dfs(stanga[nod]);
printf("%d ", v[nod]);
dfs(dreapta[nod]);
nr_elemente[nod] = nr_elemente[stanga[nod]] + nr_elemente[dreapta[nod]] + 1;
}
/*void search(int nod,int k)
{
// printf("%d %d\n",nod,k);
if(k == nr_elemente[stanga[nod]] + 1)
{
printf("%d ",v[nod]);
return ;
}
if(nr_elemente[stanga[nod]] < k)
search(dreapta[nod], k - nr_elemente[stanga[nod]]);
else search(stanga[nod],k);
}*/
int main ()
{
int i;
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
srand(time(0));
scanf("%d",&n);
for(i = 1; i <= n; i++)
scanf("%d",&v[i]);
for(i = 1; i <= n; i++)
p[i] = rand() % 1000000000;
for(i = 2; i <= n; i++)
tata[i] = -1;
radacina = 1;
for(i = 2; i <= n; i++)
{
insert(radacina,i);
// printf("tatal lui %d este %d\n",i,tata[i]);
while(sift(i));
// printf("tatal lui %d este %d\n",i,tata[i]);
if(!tata[i])
radacina = i;
}
// printf("ajung\n");
// for(i = 1; i <= n; i++)
// printf("%d %d %d %d %d %d\n",i,tata[i],stanga[i],dreapta[i],v[i], p[i]);
//for(i = 1; i <= n; i++)
// if(!tata[i])
// {
dfs(radacina);
// radacina = i;
// break;
//}
// for(i = 1; i <= n; i++)
// printf("%d ",nr_elemente[i]);
// printf("\n");
//for(i = 1; i <= n; i++)
// search(radacina,i);
printf("\n");
return 0;
}