#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
#define dim 500001
struct numere
{
int val, poz;
} v[dim], minim[2*dim]; //poz[50001];;
int poz_min; //pozitia minimului in vectorul v
numere comp(numere a, numere b)
{
if(a.val <= b.val)
return a;
else
return b;
}
numere create(int nod, int l, int r)
{
if(r==l) //dc suntem in frunza
{
minim[nod].val = v[l].val;
minim[nod].poz = v[l].poz;
//poz_min = l;
//cout<<v[l];
//v[l] = INT_MAX;
return v[l];
}
//else -> dc suntem in nod interior
int mid = (l+r)/2; //in caz de overflow: l+(r-l)2;
numere val1 = create(2*nod, l, mid);
numere val2 = create(2*nod+1, mid+1, r);
//minim[nod] = val1>val2? val1 : val2; - time limit caca maca
minim[nod] = comp(val1, val2);
return minim[nod];
}
void update(int nod, int l, int r, int ind, int val)
{
if(r==l)
{
v[l].val = val;
//poz_min = l;
minim[nod].val=val;
minim[nod].poz=l;
//cout<<v[l];
//v[l] = INT_MAX;
}
else
{
int mid = l+(r-l)/2;
if(ind <= mid)
update(2*nod, l, mid, ind, val);
else
update(2*nod+1, mid+1, r, ind, val);
//minim[nod] = minim[2*nod] > minim[2*nod+1]? minim[2*nod] : minim[2*nod+1];
minim[nod] = comp(minim[2*nod], minim[2*nod+1]);
}
}
void afisare(int n)
{
int i;
cout<<"minim[i]: "<<endl;
for(i=1; i<=4*n; i++)
cout<<minim[i].val<<" ";
}
/*int query(int nod, int l, int r, int st, int dr)
//l, r capetele intervalului de care este raspunzator nodul
//st, dr capetele intervalului din cerinta
{
if(l>=st && r<=dr)
return minim[nod];
else
if(r<st || l>dr)
return 0;
//else
int mid = (l+r)/2;
int val1 = query(2*nod, l, mid, st, dr);
int val2 = query(2*nod +1, mid+1, r, st, dr);
//return val1>val2? val1: val2;
return min(val1, val2);
}*/
int main()
{
int n, i;
fin>>n;
for(i=1; i<=n; i++)
{
fin>>v[i].val;
v[i].poz = i;
}
//afisare(n);
//cout<<endl;
numere nr_sort = create(1, 1, n);
for(i=1; i<=n; i++)
{
//cout<<"nr_sort.val: "<<minim[1].val<<" "<<endl;
//afisare(n);
//cout<<endl;
//cout<<"v[i]: "<<endl;
//for(int j=1; j<=n; j++)
// cout<<v[j].val<<" ";
//cout<<endl;
fout<<minim[1].val<<" ";
update(1, 1, n, minim[1].poz, INT_MAX);
//fout<<minim[1]<<" ";
//update(1, 1, n, poz_min, INT_MAX);
//cout<<minim[1]<<" ";
//update(1, 1, n, poz_min, INT_MAX );
}
}