Cod sursa(job #1424735)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 25 aprilie 2015 13:51:37
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct treap {
    int value;
    int priority;

    treap *left, *right;

    treap (int _value = 0, int _priority = 0, treap *_left = NULL, treap *_right = NULL): value(_value), priority(_priority), left(_left), right(_right) {}
} *root, *nil;

inline void rot_left (treap* &t) {
    treap* aux = t -> right;
    t -> right = aux -> left;
    aux -> left = t;
}

inline void rot_right (treap * &t) {
    treap* aux = t -> left;
    t -> left = aux -> right;
    aux -> right = t;
}

inline void balance (treap* &t) {
    if (t -> left -> priority > t -> priority)
        rot_right(t);
    else if (t -> right -> priority > t -> priority)
        rot_left(t);
}

void ins (treap* &t, int value, int priority) {
    if (t == nil) {
        t = new treap(value, priority, nil, nil);
        return ;
    }

    if (value < t -> value)
        ins(t -> left, value, priority);
    else if (value > t -> value)
        ins(t -> right, value, priority);

    balance(t);
}

bool found (treap* &t, int value) {
    if (t == nil)
        return false;

    if (value < t -> value)
        return found(t -> left, value);
    else if (value > t -> value)
        return found(t -> right, value);
    else
        return true;
}

void coboara (treap * &t) {
    cout << "coboara " << endl;

    if (t -> left == nil && t -> right == nil) {
        delete t;
        t = nil;

        return ;
    }

    if (t -> left -> priority > t -> right -> priority) {
        rot_right(t);
        coboara(t -> right);
    }
    else {
        rot_left(t);
        coboara(t -> left);
    }

    balance(t);
}

void del (treap * &t, int value) {
    if (t == nil)
        return ;

    if (value < t -> value)
        del(t -> left, value);
    else if (value > t -> value)
        del(t -> right, value);
    else {
        t -> priority = -100;
        coboara(t);
    }

    balance(t);
}

int main()
{
    srand(time(0));

    nil = new treap(-1, -1);
    nil -> left = nil -> right = nil;

    root = nil;

    int t = 0;
    cin >> t;

    int tip, x;
    while (t--) {
        cin >> tip >> x;

        if (tip == 1)
            ins(root, x, rand());
        else if (tip == 2)
            del(root, x);
        else
            cout << found(root, x) << '\n';
    }

    return 0;
}