Cod sursa(job #1267959)

Utilizator geniucosOncescu Costin geniucos Data 20 noiembrie 2014 15:15:41
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;

int Q, tip, x;

struct T
{
    int K, P;
    T *l, *r;
    T (int K, int P, T *l, T *r)
    {
        this->l = l;
        this->r = r;
        this->K = K;
        this->P = P;
    }
}*R, *nil;

int Rand()
{
    return (((rand()%(1<<14))<<14) + rand()%(1<<14));
}

void rotleft (T *&n)
{
    T *t = n->l;
    n->l = t->r, t->r = n;
    n = t;
}

void rotright (T *&n)
{
    T *t = n->r;
    n->r = t->l, t->l = n;
    n = t;
}

void balance (T *&n)
{
    if (n->l->P > n->P) rotleft (n);
    else
    if (n->r->P > n->P) rotright (n);
}

bool Query (T *&n, int v)
{
    if (n == nil) return 0;
    if (n->K == v) return 1;
    if (n->K > v) return Query (n->l, v);
    return Query (n->r, v);
}

void Insert (T *&n, int v)
{
    if (n == nil)
    {
        n = new T (v, Rand(), nil, nil);
        return ;
    }
    if (n->K > v) Insert (n->l, v);
    else Insert (n->r, v);
    balance (n);
}

void Erase (T *&n, int v)
{
    if (n->K > v) Erase (n->l, v);
    else
    if (n->K < v) Erase (n->r, v);
    else
    {
        if (n->l == nil && n->r == nil)
            delete n, n = nil;
        else
        {
            if (n->l->P > n->r->P)
                rotleft (n);
            else
                rotright (n);
            Erase (n, v);
        }
    }
}

void afis (T *&n)
{
    if (n == nil) return ;
    afis (n->l);
    printf ("%d ", n->K);
    afis (n->r);
}

int main()
{
freopen ("hashuri.in", "r", stdin);
freopen ("hashuri.out", "w", stdout);

srand ( time (0) );
nil = new T (0, 0, 0, 0);
R = nil;

scanf ("%d", &Q);
while (Q)
{
    Q--;
    scanf ("%d %d", &tip, &x);
    if (tip == 1)
    {
        if (!Query (R, x))
            Insert (R, x);
    }
    else
    if (tip == 2)
    {
        if (Query (R, x))
            Erase (R, x);
    }
    else printf ("%d\n", Query (R, x));

    //afis (R), printf ("\n");
}

return 0;
}