Cod sursa(job #1457174)

Utilizator retrogradLucian Bicsi retrograd Data 2 iulie 2015 21:00:51
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <bits/stdc++.h>

using namespace std;
typedef int var;

struct Treap {

    struct nod {
        var val, priority;
        nod *ls, *ld;
        nod(var val, var priority, nod* s, nod* d) {
            this->priority = priority;
            this->val = val;
            ls = s; ld = d;
        }
    };
    typedef nod* pnod;

    pnod nill, root;
    Treap() {
        nill = new nod(0, -1, nill, nill);
        nill->priority = -1;
        root = nill;
    }

    void rot_left(pnod &p) {
        pnod aux = p->ld;
        p->ld = aux->ls;
        aux->ls = p;
        p = aux;
    }
    void rot_right(pnod &p) {
        pnod aux = p->ls;
        p->ls = aux->ld;
        aux->ld = p;
        p = aux;
    }

    void _insert(pnod &p, const var &val, const var &pri) {
        if(p == nill) {
            p = new nod(val, pri, nill, nill);
        } else {

            if(val < p->val)        _insert(p->ls, val, pri);
            else if(val > p->val)   _insert(p->ld, val, pri);

            if(p->priority < p->ls->priority)
                rot_right(p);
            else if(p->priority < p->ld->priority)
                rot_left(p);
        }
    }
    void insert(var val) {
        _insert(root, val, rand());
    }

    void _erase(pnod &p, const var &val) {
        if(p == nill) return;

        if(val < p->val) return _erase(p->ls, val);
        if(val > p->val) return _erase(p->ld, val);

        if(p->ls == nill && p->ld == nill) {
            delete p; p = nill; return;
        }

        (p->ls->priority > p->ld->priority) ? rot_right(p) : rot_left(p);
        _erase(p, val);
    }
    void erase(var val) {
        _erase(root, val);
    }

    pnod _find(pnod &p, const var &val) {
        if(p == nill) return NULL;

        if(val < p->val) return _find(p->ls, val);
        if(val > p->val) return _find(p->ld, val);
        return p;
    }
    pnod find(var val) {
        return _find(root, val);
    }

    void _print(pnod &p) {
        if(p == nill) return;
        _print(p->ls);
        cout << p->val << " ";
        _print(p->ld);
    }
    void print() {
        _print(root);
    }
};
Treap T;

void Read(var &a) {
    a = 0;
    char c;
    for(c = getchar(); !isdigit(c); c = getchar());
    for(;isdigit(c); c = getchar())
        a = a * 10 + c - '0';
}

int main() {

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

    var m, t, a;
    Read(m);

    while(m--) {
        Read(t); Read(a);
        if(t == 1) T.insert(a);
        else if(t == 2) T.erase(a);
        else printf("%d\n", (T.find(a) != NULL));
    }
    return 0;
}