Pagini recente » Cod sursa (job #106790) | Cod sursa (job #1298884) | Cod sursa (job #620045) | Cod sursa (job #433747) | Cod sursa (job #812596)
Cod sursa(job #812596)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct treap{
int key, p, din;
treap *st, *dr;
treap () {}
treap (int key, int p, treap *st, treap *dr)
{
this -> din = 0;
this -> key = key;
this -> p = p;
this -> st = st;
this -> dr = dr;
}
} *r, *nil;
int n;
void rotst (treap* &nod)
{
treap *t = nod -> dr;
t -> din = nod -> din;
nod -> dr = t -> st;
t -> st = nod;
nod -> din = nod -> st -> din + nod -> dr -> din + 1;
nod = t;
}
void rotdr (treap* &nod)
{
treap *t = nod -> st;
t -> din = nod -> din;
nod -> st = t -> dr;
t -> dr = nod;
nod -> din = nod -> st -> din + nod -> dr -> din + 1;
nod = t;
}
void balance (treap* &nod)
{
if (nod -> st -> p > nod -> p)
rotdr (nod);
else if (nod -> dr -> p > nod -> p)
rotst (nod);
}
void insert (treap* &nod, int key, int p)
{
if (nod == nil)
{
nod = new treap (key, p, nil, nil);
return;
}
if (key < nod -> key)
{
nod -> din ++;
insert (nod -> st, key, p);
}
else
{
nod -> din ++;
insert (nod -> dr, key, p);
}
balance (nod);
}
void erase (treap* &nod, int key)
{
if (nod == nil)
return;
if (nod -> key == key)
{
if (nod -> st == nil && nod -> dr == nil)
delete nod, nod = nil;
else
{
if (nod -> st -> p > nod -> dr -> p)
rotdr (nod);
else
rotst (nod);
erase (nod, key);
}
return;
}
if (key < nod -> key)
erase (nod -> st, key);
else
erase (nod -> dr, key);
}
treap* findk (treap* &nod, int k)
{
if (k == nod -> st -> din + 1)
return nod;
if (k <= nod -> st -> din)
return findk (nod -> st, k);
else
return findk (nod -> dr, k - nod -> st -> din - 1);
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen ("algsort.in", "r", stdin);
freopen ("algeort.out", "w", stdout);
#endif
srand (time (0));
r = nil = new treap (0, 0, NULL, NULL);
scanf ("%d", &n);
int i, x;
for (i = 1; i <= n; i ++)
{
scanf ("%d", &x);
insert (r, x, rand() + 1);
}
for (i = 1; i <= n; i ++)
printf ("%d ", findk (r, i) -> key);
return 0;
}