Cod sursa(job #1368515)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 2 martie 2015 18:16:06
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;

struct Node
{
    int key;
    int priority;

    Node *st, *dr;

    Node(const int k, const int p, Node* lt, Node* rt) : key(k), priority(p), st(lt), dr(rt) {}
};

Node *NIL, *root;

void initTreap()
{
    NIL = new Node(0, 0, NULL, NULL);
    root = NIL;
}

void rol(Node *&T)
{
    Node* aux = T->st;
    T->st = aux->dr;
    aux->dr = T;

    T = aux;
}

void ror(Node *&T)
{
    Node* aux = T->dr;
    T->dr = aux->st;
    aux->st = T;

    T = aux;;
}

void balance(Node *&T)
{
    if ( T->st->priority > T->priority )
        rol(T);

    if ( T->dr->priority > T->priority )
        ror(T);
}

void insert(Node*& T, const int k, const int p = 1 + rand() % INF)
{
    if (T == NIL)
    {
        T = new Node(k, p, NIL, NIL);
    }
    else
    {
        if ( k < T->key )
            insert(T->st, k, p);
        else
            if ( k > T->key )
                insert(T->dr, k, p);

        balance(T);
    }
}

void erase(Node *&T, const int k)
{
    if (T == NIL) return;

    if (T->key == k)
    {
        if ( T->st == NIL && T->dr == NIL )
        {
            delete T;
            T = NIL;
        }
        else
        {
            if ( T->st->priority > T->dr->priority )
            {
                rol(T);
                erase(T->dr, k);
            }
            else
            {
                ror(T);
                erase(T->st, k);
            }
        }
    }
    else
        if (k < T->key)
            erase(T->st, k);
        else
            erase(T->dr, k);
}

bool find(Node *&T, const int k)
{
    if (T == NIL) return false;
    if (T->key == k) return true;
    if (k < T->key) return find(T->st, k);
    else            return find(T->dr, k);
}

int main()
{
    ifstream in("hashuri.in");
    ofstream out("hashuri.out");

    ios_base::sync_with_stdio( false );

    int N;
    initTreap();

    in >> N;

    while ( N-- )
    {
        int tip, x;

        in >> tip >> x;

        switch(tip)
        {
            case 1: insert(root, x); break;
            case 2: erase(root, x); break;
            case 3: out << find(root, x) << "\n"; break;

            default: cerr << "Error\n";
        }
    }

    return 0;
}