Pagini recente » Cod sursa (job #2922974) | Cod sursa (job #257051) | Cod sursa (job #394864) | Razvy | Cod sursa (job #942640)
Cod sursa(job #942640)
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
int n, m;
struct Treap
{
int key, priority;
Treap *left, *right;
Treap() {}
Treap(int key, int priority, Treap *left, Treap *right)
{
this->key=key;
this->priority=priority;
this->left=left;
this->right=right;
}
} *rad, *nil;
void rotright(Treap* &nod)
{
Treap *aux = nod->left;
nod->left = aux->right;
aux->right = nod;
nod=aux;
}
void rotleft(Treap* &nod)
{
Treap *aux = nod->right;
nod->right = aux->left;
aux->left = nod;
nod=aux;
}
void balance(Treap* &nod)
{
if(nod->priority < nod->left->priority)
rotright(nod);
else
if(nod->priority < nod->right->priority)
rotleft(nod);
}
void insert(Treap* &nod, int key, int priority)
{
if(nod==nil)
{
nod=new Treap(key, priority, nil, nil);
return;
}
if(key < nod->key)
insert(nod->left, key, priority);
else
insert(nod->right, key, priority);
balance(nod);
}
void erase(Treap* &nod, int key)
{
if(nod==nil)
return;
if(key < nod->key)
erase(nod->left, key);
else
if(key > nod->key)
erase(nod->left, key);
else
{
if(nod->left==nil && nod->right==nil)
{
delete nod;
nod = nil;
}
if(nod->left->priority > nod->right->priority)
rotright(nod);
else
rotleft(nod);
erase(nod, key);
}
}
void df(Treap* &nod)
{
if(nod==nil)
return;
df(nod->left);
printf("%d ", nod->key);
df(nod->right);
}
int main()
{
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
srand(time(0));
scanf("%d", &n);
rad = nil = new Treap(0, 0, NULL, NULL);
for(int i=1; i<=n; ++i)
{
int x;
scanf("%d", &x);
insert(rad, x, rand()%1000000000+1);
}
df(rad);
printf("\n");
return 0;
}