#include <cstdio>
#include <cmath>
#include <time.h>
#include <cstdlib>
using namespace std;
class Treap{
public:
int value,priority;
Treap *st,*dr;
Treap(){
value = priority = 0;
st = dr = 0;
}
Treap(int value,int priority,Treap *st, Treap *dr){
this->value = value;
this->priority = priority;
this->st = st;
this->dr = dr;
}
};
Treap *root,*nil;
void Rotate_left(Treap *&T)
{
Treap *aux = T->st;
T->st = aux->dr;
aux->dr = T;
T = aux;
}
void Rotate_right(Treap *&T)
{
Treap *aux = T->dr;
T->dr = aux->st;
aux->st = T;
T = aux;
}
void Balance(Treap *&T)
{
if(T->st->priority > T->priority)
Rotate_left(T);
else
if(T->dr->priority > T->priority)
Rotate_right(T);
}
void Insert(int value,int priority,Treap *&T)
{
if(T == nil){
T = new Treap(value,priority,nil,nil);
return;
}
if(T->value > value)
Insert(value,priority,T->st);
else
Insert(value,priority,T->dr);
Balance(T);
}
void Delete(int value,Treap *&T)
{
if(T == nil) return;
if(T->value > value)
Delete(value,T->st);
else
Delete(value,T->dr);
if(T->st == nil && T->dr == nil)
delete T, T = nil;
else
{
if(T->st->priority > T->dr->priority)
Rotate_left(T);
else
Rotate_right(T);
Delete(value,T);
}
}
int Search(int value,Treap *&T)
{
if(T == nil) return 0;
if(T->value == value) return 1;
if(T->value > value)
return Search(value,T->st);
return Search(value,T->dr);
}
void Split(int value,Treap *&T,Treap *&Tmic,Treap *&Tmare)
{
Insert(value,2*(0x3f3f3f3f),T);
Tmic = T->st;
Tmare = T->dr;
delete T;
}
void Join(int value,Treap *&T,Treap *&Tmic, Treap *&Tmare)
{
Treap *aux = new Treap(value,0,Tmic,Tmare);
Delete(aux->value,aux);
delete Tmic;
delete Tmare;
}
Treap Tm,TM;
void Init(Treap *&T){
T = nil = new Treap(0,0,NULL,NULL);
srand(unsigned(time(0)));
}
void Sort(Treap *T)
{
if(T == nil) return;
Sort(T->st);
printf("%d ",T->value);
Sort(T->dr);
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
int N,x;
scanf("%d",&N);
Init(root);
for(int i = 1; i <= N; ++i){
scanf("%d",&x);
Insert(x,rand()+1,root);
}
Sort(root);
return 0;
}