Cod sursa(job #1427295)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 1 mai 2015 21:22:16
Problema Hashuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <fstream>
#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;

void split (treap* t, int value, treap* &l, treap* &r) {
    if (t == nil) {
        l = r = nil;
        return ;
    }

    if (value < t -> value) {
        split(t -> left, value, t -> left, r);
        t -> left = r;
        r = t;
    }
    else {
        split(t -> right, value, l, t -> right);
        t -> right = l;
        l = t;
    }
}

void merge (treap* &t, treap* l, treap* r) {
    if (l == nil) {
        t = r;
        return ;
    }
    else if (r == nil) {
        t = l;
        return ;
    }

    if (l -> priority < r -> priority) {
        merge(r -> right, r -> left, r -> right);
        r -> left = l;
        t = r;
    }
    else {
        merge(t -> left, l -> left, l -> right);
        l -> right = r;
        t = l;
    }
}

void insert (treap* &t, int value, int priority) {
    if (priority > t -> priority) {
        treap *l = new treap(value, priority);

        split(t, value, l -> left, l -> right);
        t = l;

        return ;
    }

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

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

    if (t -> value == value) {
        treap *aux = t;

        merge(t, t -> left, t -> right);
        delete aux;

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

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

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

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

    srand(time(0));

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

    root = nil;

    int n = 0;
    cin >> n;

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

        if (tip == 1)
            insert(root, x, rand());
        else if (tip == 2)
            erase(root, x);
        else
            cout << count(root, x) << '\n';
    }

    cin.close();
    cout.close();
    return 0;
}