Cod sursa(job #1229067)

Utilizator Kira96Denis Mita Kira96 Data 16 septembrie 2014 11:04:38
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#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;
}