Cod sursa(job #470628)

Utilizator blasterzMircea Dima blasterz Data 14 iulie 2010 21:50:48
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
/*
 *	Algsort
 *	Treap = Balanced BST
 *	@author: Mircea Dima
*/

#include <cstdio>
#include <cstdlib>
#include <ctime>
#define dim 8192
#define oo 0x3f3f3f3f

char ax[dim];
int pz;

inline void cit (int &x)
{
	x = 0;
	while (ax[pz] < '0' || ax[pz] > '9')
		if (++pz == dim)
			fread (ax, 1, dim, stdin), pz = 0;
		
	while (ax[pz] >= '0' && ax[pz] <= '9')
	{
		x = x * 10 + ax[pz] - '0';
		if (++pz == dim)
			fread (ax, 1, dim, stdin), pz = 0;
	}
	
}


struct nod
{
	int key;
	int priority;
	nod *left, *right;
};

typedef nod* tree;

tree R, nil;

void init ()
{
	srand (time (0));
	nil = new nod;
	nil->left = nil->right = 0;
	nil->key = 0;
	nil->priority = -oo;
	R = nil;
}

inline void rotateLeft (tree &n)
{
	tree t = n->left;
	n->left = t->right;
	t->right = n;
	n = t;
}

inline void rotateRight (tree &n)
{
	tree t = n->right;
	n->right = t->left;
	t->left = n;
	n = t;
}

inline void insert (tree &n, int v)
{
	if (n == nil)
	{
		n = new nod;
		n->left = n->right = nil;
		n->key = v;
		n->priority = rand ();
		return;
	}
	
	if (v < n->key) 
	{
		if (n->priority < n->left->priority)
			rotateLeft (n);
		insert (n->left, v);
	}
	else
	{
		if (n->priority < n->right->priority)
			rotateRight (n);
		insert (n->right, v);
	}
}

inline void ino (tree n)
{
	if (n == nil) return;
	ino (n->left);
	printf ("%d ", n->key);
	ino (n->right);
}

int main ()
{
	freopen ("algsort.in", "r", stdin);
	freopen ("algsort.out", "w", stdout);
	
	init ();
	int n;
	cit (n);
	//scanf ("%d", &n);
	int v;
	for (int i = 1; i <= n; ++i)
	{
	//	scanf ("%d", &v);
		cit (v);
		insert (R, v);
	}
	
	ino (R);
	
	printf ("\n");
	return 0;
}