Cod sursa(job #1233921)

Utilizator Kira96Denis Mita Kira96 Data 26 septembrie 2014 12:47:23
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<ctime>
#include<fstream>
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int n,x;
struct Treap
{
	Treap *l,*r;
	int key,pr;
	Treap() {}
	Treap(int _key,int _pr)
	{
		l=r=NULL;
		key=_key;
		pr=_pr;
	}
};
#define T Treap*
T R;
void split(T t,int k,T &l,T &r)
{
	if(!t)
		l=r=NULL;
	else
	if(k<t->key)
		split(t->l,k,l,t->l),r=t;
	else
		split(t->r,k,t->r,r),l=t;
}
void merge(T &t,T l,T r)
{
	if(!l||!r)
		t=l?l:r;
	else
	if(l->pr > r->pr)
		merge(l->r,l->r,r),t=l;
	else
		merge(r->l,l,r->l),t=r;
}
void insert(T &t,T it)
{
	if(!t)
		t=it;
	else
	if(it->pr > t->pr)
		split(t,it->key,it->l,it->r),t=it;
	else
		insert(it->key>t->key?t->r:t->l,it);
}
void erase(T &t,int k)
{
	if(t->key==k)
		merge(t,t->l,t->r);
	else
		erase(k>t->key?t->r:t->l,k);
}
void dfs(T t)
{
	if(!t)
		return;
	dfs(t->l);
	g<<t->key<<" ";
	dfs(t->r);
}
int main ()
{
	srand(time(0));
	f>>n;
	FOR(i,1,n)
	{
		f>>x;
		T it=new Treap(x,rand()+1);
		insert(R,it);
	}
	dfs(R);
	return 0;
}