Pagini recente » Cod sursa (job #1674783) | Cod sursa (job #1383332) | Cod sursa (job #388795) | Cod sursa (job #516671) | Cod sursa (job #470628)
Cod sursa(job #470628)
/*
* 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;
}