Cod sursa(job #942640)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 23 aprilie 2013 09:58:42
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#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;
}