Cod sursa(job #1537184)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 26 noiembrie 2015 23:46:51
Problema Hashuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <bits/stdc++.h>

using namespace std;

struct Node
{
    int key;
    int priority;

    Node *st, *dr;

    Node(int k, int p, Node *l, Node *r)
    {
        this->key = k;
        this->priority = p;
        this->st = l;
        this->dr = r;
    }
};

Node *ROOT, *NIL;

void initTreap()
{
    srand(time(nullptr));
    NIL = new Node(0, 0, nullptr, nullptr);
    ROOT = NIL;
}

void rotateToLeft(Node *&T)
{
    Node *tmp = T->dr;
    T->dr = tmp->st;
    tmp->st = T;

    T = tmp;
}

void rotateToRight(Node *&T)
{
    Node *tmp = T->st;
    T->st = tmp->dr;
    tmp->dr = T;

    T = tmp;
}

void balance(Node *&T)
{
    if (T->st->priority > T->priority)
        rotateToRight(T);
    else if (T->dr->priority > T->priority)
        rotateToLeft(T);
}

void insert(Node *&T, int key, int priority = rand() % 1)
{
    if (T == NIL)
        T = new Node(key, priority, NIL, NIL);
    else
    {
        if (key < T->key)
            insert(T->st, key, priority);
        else if (key > T->key)
            insert(T->dr, key, priority);

        balance(T);
    }
}

bool find(Node *&T, int key)
{
    if (T == NIL)
        return false;

    if (T->key == key)
        return true;

    if (key < T->key)
        return find(T->st, key);
    else
        return find(T->dr, key);
}

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

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

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

    int N, X, tip;

    in >> N;

    initTreap();

    while (N--)
    {
        in >> tip >> X;

        if (tip == 1)
            insert(ROOT, X);
        else if (tip == 2)
            erase(ROOT, X);
        else
            out << find(ROOT, X) << "\n";
    }

    return 0;
}