Cod sursa(job #947770)

Utilizator darrenRares Buhai darren Data 8 mai 2013 13:36:05
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <algorithm>

using namespace std;

struct Treap
{
    int key, val;
    Treap *left, *right;

    Treap()
    {
    }
    Treap(int _key, int _val, Treap* _left, Treap* _right)
    {
        key = _key;
        val = _val;
        left = _left;
        right = _right;
    }
};

Treap *R, *nil;

void rotate_left(Treap* &T)
{
    Treap* aux = T->left;
    T->left = aux->right;
    aux->right = T;
    T = aux;
}
void rotate_right(Treap* &T)
{
    Treap* aux = T->right;
    T->right = aux->left;
    aux->left = T;
    T = aux;
}
void balance(Treap* &T)
{
    if (T->val < T->left->val)
        rotate_left(T);
    if (T->val < T->right->val)
        rotate_right(T);
}
void insert(Treap* &T, int key, int val)
{
    if (T == nil)
    {
        T = new Treap(key, val, nil, nil);
        return;
    }

    if (key == T->key) return;
    if (key < T->key) insert(T->left, key, val);
    else              insert(T->right, key, val);

    balance(T);
}
void erase(Treap* &T, int key)
{
    if (T == nil) return;

    if (key < T->key) erase(T->left, key);
    else if (key > T->key) erase(T->right, key);
    else
    {
        if (T->left == nil && T->right == nil)
        {
            delete T;
            T = nil;

            return;
        }
        if (T->left->val > T->right->val)
        {
            rotate_left(T);
            erase(T->right, key);
        }
        else
        {
            rotate_right(T);
            erase(T->left, key);
        }
    }
}
bool access(Treap* T, int key)
{
    if (T == nil) return false;

    if (key == T->key) return true;
    else if (key < T->key) return access(T->left, key);
    else if (key > T->key) return access(T->right, key);

    return false;
}

int N;

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

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

    fin >> N;
    for (int i = 1, type, val; i <= N; ++i)
    {
        fin >> type >> val;

        if (type == 1)
            insert(R, val, rand() + 1);
        else if (type == 2)
            erase(R, val);
        else if (type == 3)
            fout << access(R, val) << '\n';
    }

    fin.close();
    fout.close();
}