#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<algorithm> #define For(i,j,k) for (i=j;i<=k;i++) using namespace std; const int dmax=101000; struct node{ int x,w; struct node *f,*l,*r; node(){ f=l=r=NULL; x=w=0; } }; struct node *h,*p,*q; int random(){ return (int)rand()*1.0/32767*2147483647; } void left(struct node *u,struct node *v){ if (v==h) h=u; v->r=u->l; if (u->l!=NULL) u->l->f=v; u->f=v->f; if (v->f!=NULL) if (v->f->l==v) v->f->l=u; else v->f->r=u; v->f=u; u->l=v; } void right(struct node *u,struct node *v){ if (v==h) h=u; v->l=u->r; if (u->r!=NULL) u->r->f=v; u->f=v->f; if (v->f!=NULL) if (v->f->l==v) v->f->l=u; else v->f->r=u; v->f=u; u->r=v; } void ll(struct node *x,struct node *y,struct node *z){ right(y,z); right(x,y); } void rr(struct node *x,struct node *y,struct node *z){ left(y,z); left(x,y); } void lr(struct node *x,struct node *y,struct node *z){ left(x,y); right(x,z); } void rl(struct node *x,struct node *y,struct node *z){ right(x,y); left(x,z); } void insert(struct node *t,int k){ if (k<t->x){ if (t->l==NULL){ p=new node; p->x=k; p->w=random(); p->f=t; t->l=p; while (p->f!=NULL){ if (p->f->f==NULL) if (p==p->f->l) right(p,p->f); else left(p,p->f); else if (p->f->f->l!=NULL && p->f->f->l->l==p) ll(p,p->f,p->f->f); else if (p->f->f->l!=NULL && p->f->f->l->r==p) lr(p,p->f,p->f->f); else if (p->f->f->r!=NULL && p->f->f->r->r==p) rr(p,p->f,p->f->f); else if (p->f->f->r!=NULL && p->f->f->r->l==p) rl(p,p->f,p->f->f); } }else insert(t->l,k); }else{ if (t->r==NULL){ p=new node; p->x=k; p->w=random(); p->f=t; t->r=p; while (p->f!=NULL){ if (p->f->f==NULL) if (p==p->f->l) right(p,p->f); else left(p,p->f); else if (p->f->f->l!=NULL && p->f->f->l->l==p) ll(p,p->f,p->f->f); else if (p->f->f->l!=NULL && p->f->f->l->r==p) lr(p,p->f,p->f->f); else if (p->f->f->r!=NULL && p->f->f->r->r==p) rr(p,p->f,p->f->f); else if (p->f->f->r!=NULL && p->f->f->r->l==p) rl(p,p->f,p->f->f); } }else insert(t->r,k); } } void out(struct node *t){ if (t->l!=NULL) out(t->l); printf("%d ",t->x); if (t->r!=NULL) out(t->r); } void safe_out(struct node *t){ struct node *stack[101000]; int top=0; while (1){ if (t){ stack[++top]=t; t=t->l; }else{ t=stack[top]; printf("%d ",t->x); top--; t=t->r; } if (top==0 && t==NULL) break; } } int main(){ int i,j,k,m,n; scanf("%d",&n); scanf("%d",&k); h=new node; h->x=k; h->w=random(); For(i,2,n){ scanf("%d",&k); insert(h,k); } safe_out(h); return 0; }