Cod sursa(job #1193035)

Utilizator andreiiiiPopa Andrei andreiiii Data 30 mai 2014 18:21:57
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 kb
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

using namespace std;


struct TreapNode {
    int key, pry;
    TreapNode *left, *right;

    TreapNode(){};
    TreapNode(const int _key, const int _pry, TreapNode *_left, TreapNode *_right)
    {
        key = _key;
        pry = _pry;
        left = _left;
        right = _right;
    }
} *Root, *NIL;

void RotLeft(TreapNode* &node)
{
    TreapNode *aux = node->left;
    node->left = aux->right;
    aux->right = node;
    node = aux;
}

void RotRight(TreapNode* &node)
{
    TreapNode *aux = node->right;
    node->right = aux->left;
    aux->left = node;
    node = aux;
}

void Balance(TreapNode* &node)
{
    if (node->left->pry > node->pry)
        RotLeft(node);
    else if(node->right->pry > node->pry)
        RotRight(node);
}

int Find(TreapNode *node, const int key)
{
    if (node == NIL) return 0;

    if (key < node->key)
        return Find(node->left, key);
    if (key > node->key)
        return Find(node->right, key);

    return 1;
}

void Insert(TreapNode* &node, const int key, const int pry)
{
    if (node == NIL)
    {
        node = new TreapNode(key, pry, NIL, NIL);
        return;
    }

    if (key < node->key) Insert(node->left, key, pry);
    else if (key > node->key) Insert(node->right, key, pry);

    Balance(node);
}

void Erase(TreapNode* &node, const int key)
{
    if (node == NIL) return;

    if (key == node->key)
    {
        if (node->right == NIL && node->left == NIL)
        {
            delete node;
            node = NIL;

            return;
        }
        else if (node->left->pry > node->right->pry)
            RotLeft(node);
        else
            RotRight(node);

        Erase(node, key);
    }
    else if (key < node->key)
        Erase(node->left, key);
    else
        Erase(node->right, key);
}

void Init()
{
    srand(time(0));
    Root = NIL = new TreapNode(0, 0, NULL, NULL);
}

int get_rand()
{
    int ret = (rand() % 32013 * 10000) + rand() % 32013;
    if (ret < 0) return -ret;
    if (!ret) return 1;
    return ret;
}

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

    Init();

    int Q;
    scanf("%d", &Q);

    while (Q--)
    {
        int op, x;
        scanf("%d%d", &op, &x);

        if (op == 1)
            Insert(Root, x, get_rand());
        else if (op == 2)
            Erase(Root, x);
        else if (op == 3)
            printf("%d\n", Find(Root, x));
    }
}