Cod sursa(job #1291201)

Utilizator cahemanCasian Patrascanu caheman Data 12 decembrie 2014 15:19:41
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include<cstdio>
#include<ctime>
#include<cstdlib>
// aici aveti un 666

using namespace std;

struct t
{
    short k, nr, p;
    t *f1, *f2;
    t()
    {
        k = 0;
        p = 0;
        nr = 0;
    }
    t(short a, short b, t *c, t *d)
    {
        k = a;
        p = b;
        f1 = c;
        f2 = d;
        nr = 1;
    }
};

t *radarada, *nil;
int n;

void recalc(t* &r)
{
    if(r != nil)
        r->nr = 1 + r->f1->nr + r->f2->nr;
}

void Rrot(t* &r)
{
    t *temp = r->f2;
    r->f2 = temp->f1;
    temp->f1 = r;
    r = temp;
}

void Lrot(t* &r)
{
    t *temp = r->f1;
    r->f1 = temp->f2;
    temp->f2 = r;
    r = temp;
}

void balance(t* &r)
{
    if(r->f2->p > r->p)
        Rrot(r);
    if(r->f1->p > r->p)
        Lrot(r);

    recalc(r->f1);
    recalc(r->f2);
    recalc(r);
}

void update(t* &r, short key, short val, short prior)
{
    if(r == nil)
    {
        r = new t(key, prior, nil, nil);
        return;
    }

    if(r->f1->nr < val)
        update(r->f2, key, val - (r->f1->nr) - 1, prior);
    else
        update(r->f1, key, val, prior);

    balance(r);
}

void afrect(t* &r)
{
    if(r == nil)
        return;
    afrect(r->f1);
    printf("%d\n", r->k);
    afrect(r->f2);
}

int main()
{
    freopen("schi.in", "r", stdin);
    freopen("schi.out", "w", stdout);
    int i, x;
    scanf("%d", &n);
    srand(666);
    nil = new t;
    radarada = new t;
    nil->f1 = nil->f2 = nil;
    scanf("%d", &x);
    radarada->f1 = nil;
    radarada->f2 = nil;
    radarada->nr = 1;
    radarada->k = 1;
    radarada->p = rand() % 31666 + 1;
    for(i = 2; i <= n; ++ i)
    {
        scanf("%d", &x);
        update(radarada, i, x - 1, rand() % 31666 + 1);
    }
    afrect(radarada);
    return 0;
}