#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];
tata[dreapta[nod]] = father;
dreapta[nod] = father;
}
else
{
dreapta[father] = stanga[nod];
tata[stanga[nod]] = father;
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;
//printf("in subarborele %d avem %d\n",nod,nr_elemente[nod]);
}
void search(int nod,int k)
{
//printf("%d %d %d\n",nod,k,nr_elemente[nod]);
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]] - 1);
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("Dupa ce am inserat elementul %d avem:\n",i);
// for(int j = 1; j <= n; j++)
// printf("%d %d %d %d\n",j,tata[j],stanga[j],dreapta[j]);
}
// 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;
}