Cod sursa(job #812596)

Utilizator ironmanOmul de fier ironman Data 14 noiembrie 2012 02:57:10
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#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;
}