Cod sursa(job #1431387)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 9 mai 2015 10:42:12
Problema Hashuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct treap {
    int vl, pr;

    treap *l, *r;

    treap (int vl = 0, int pr = 0, treap *l = NULL, treap *r = NULL): vl(vl), pr(pr), l(l), r(r) {}
} *root, *nil;

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

    if (vl < t -> vl) {
        split(t -> l, vl, l, t -> l);
        l = t;

    }
    else {
        split(t -> r, vl, t -> r, r);
        r = t;
    }
}

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

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

void ins (treap* &t, int vl, int pr) {
    if (pr > t -> pr) {
        treap *aux = new treap(vl, pr, nil, nil);
        split(t, vl, aux -> l, aux -> r);
        t = aux;

        return ;
    }

    if (vl < t -> vl)
        ins(t -> l, vl, pr);
    else
        ins(t -> r, vl, pr);
}

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

    if (t -> vl == vl)
        return true;
    else if (vl < t -> vl)
        return count(t -> l, vl);
    else
        return count(t -> r, vl);
}

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

    if (t -> vl == vl) {
        treap *aux = t;
        merge(t, t -> l, t -> r);

        delete aux;
    }
    else if (vl < t -> vl)
        del(t -> l, vl);
    else
        del(t -> r, vl);
}

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

    srand(time(0));

    nil = new treap(-1, -1);
    root = nil -> l = nil -> r = nil;

    int n = 0;
    cin >> n;

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

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

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