Pagini recente » Cod sursa (job #2766618) | Cod sursa (job #763209) | Cod sursa (job #2307488) | Cod sursa (job #463571) | Cod sursa (job #1229067)
#include<ctime>
#define N 500100
#include<cstdlib>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#include<fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int s[N],n,t,x;
struct Treap
{
Treap *lef,*rig;
int key,pr;
Treap() {}
Treap(int _key,int _pr,Treap *_lef,Treap *_rig)
{
key=_key;
pr=_pr;
lef=_lef;
rig=_rig;
}
};
Treap *R,*nil;
void init()
{
srand(time(0));
R=nil=new Treap(0,0,NULL,NULL);
nil->lef=nil->rig=nil;
}
void rot_rig(Treap* &nod)
{
Treap *aux=nod->lef;
nod->lef=aux->rig;
aux->rig=nod;
nod=aux;
}
void rot_lef(Treap* &nod)
{
Treap *aux=nod->rig;
nod->rig=aux->lef;
aux->lef=nod;
nod=aux;
}
void balance(Treap* &nod)
{
if(nod->lef->pr > nod->pr)
rot_rig(nod);
if(nod->rig->pr > nod->pr)
rot_lef(nod);
}
void insert(Treap* &nod,int key,int pr)
{
if(nod==nil)
{
nod=new Treap(key,pr,nil,nil);
return;
}
if(key<=nod->key)
insert(nod->lef,key,pr);
else
insert(nod->rig,key,pr);
balance(nod);
}
void dfs(Treap *nod)
{
if(nod==nil)
return;
dfs(nod->lef);
s[++t]=nod->key;
dfs(nod->rig);
}
int main ()
{
init();
f>>n;
FOR(i,1,n)
{
f>>x;
insert(R,x,rand()+1);
}
dfs(R);
FOR(i,1,n)
g<<s[i]<<" ";
return 0;
}