///SORTARE CU ARBORI BINARI DE INTERVALE
#include <iostream>
#include <fstream>
#define INF 2147483647
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
struct structura
{
int pozitie, valoare;
}x[1200000];
void update_arb_minus1(int left, int right, int poz_arb, int poz_numar, int numar, structura x[])
{
if (left == right)
{
x[poz_arb].valoare = INF;
return;
}
int middle = (left + right) / 2;
if (poz_numar <= middle)
update_arb_minus1(left, middle, 2 * poz_arb, poz_numar, numar, x);
else
update_arb_minus1(middle + 1, right, 2 * poz_arb + 1, poz_numar, numar, x);
if(x[2 * poz_arb].valoare < x[2 * poz_arb + 1].valoare)
x[poz_arb] = x[2 * poz_arb];
else
x[poz_arb] = x[2 * poz_arb + 1];
}
void update_arb(int left, int right, int poz_arb, int poz_numar, int numar, structura x[])
{
if (left == right)
{
x[poz_arb].valoare = numar;
x[poz_arb].pozitie = poz_numar;
return;
}
int middle = (left + right) / 2;
if (poz_numar <= middle)
update_arb(left, middle, 2 * poz_arb, poz_numar, numar, x);
else
update_arb(middle + 1, right, 2 * poz_arb + 1, poz_numar, numar, x);
if(x[2 * poz_arb].valoare < x[2 * poz_arb + 1].valoare)
x[poz_arb] = x[2 * poz_arb];
else
x[poz_arb] = x[2 * poz_arb + 1];
}
void query(int left, int right, int poz_arb, int poz_left, int poz_right, structura x[], structura &maxim)
{
if (poz_left <= left && poz_right >= right)
{
if (x[poz_arb].valoare < maxim.valoare && x[poz_arb].valoare != INF)
{
maxim.valoare = x[poz_arb].valoare;
maxim.pozitie = x[poz_arb].pozitie;
}
return;
}
int middle = (left + right) / 2;
if (poz_left <= middle)
query(left, middle, 2 * poz_arb, poz_left, poz_right, x, maxim);
if (poz_right > middle)
query(middle + 1, right, 2 * poz_arb + 1, poz_left, poz_right, x, maxim);
}
int main()
{
int n, m, i, numar;
structura maxi;/// care e defapt minim :)
f >> n;
m = n;
for (i = 1; i <= n; i++)
{
f >> numar;
update_arb(1, n, 1, i, numar, x);
}
for (i = 1; i <= m; i++)
{
maxi.valoare = INF;
query(1, n, 1, 1, n, x, maxi);
update_arb_minus1(1, n, 1, maxi.pozitie, INF, x);
g << maxi.valoare << " ";
}
return 0;
}