Cod sursa(job #1970006)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 18 aprilie 2017 19:49:18
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <bits/stdc++.h>

using namespace std;

class node {
public:
    int p;
    int v;
    int sz;
    node *l;
    node *r;
    node(int _p = 0,
         int _v = 0,
         int _sz = 0,
         node *_l = nullptr,
         node *_r = nullptr) {
        p = _p;
        v = _v;
        sz = _sz;
        l = _l;
        r = _r;
    }
};

mt19937 gen;
node *nil = new node();

node *write(node *old, node *le, node *ri) {
    old->sz = le->sz + 1 + ri->sz;
    old->l = le;
    old->r = ri;
    return old;
}

pair <node*, node*> split(node *x, int val) {
    if (x == nil) {
        return {nil, nil};
    }
    node *ls;
    node *rs;
    if (x->v <= val) {
        node *nls;
        node *nrs;
        tie(nls, nrs) = split(x->r, val);
        ls = write(x, x->l, nls);
        rs = nrs;
        return {ls, nrs};
    }
    else {
        node *nls;
        node *nrs;
        tie(nls, nrs) = split(x->l, val);
        ls = nls;
        rs = write(x, nrs, x->r);
        return {ls, rs};
    }
}

node *merge(node *l, node *r) {
    if (l == nil) return r;
    if (r == nil) return l;
    if (l->p <= r->p) return write(l, l->l, merge(l->r, r));
    else return write(r, merge(l, r->l), r->r);
}

node *insert(node *x, int v) {
    node *y = new node(gen(), v, 1, nil, nil);
    node *l;
    node *r;
    tie(l, r) = split(x, v);
    return merge(merge(l, y), r);
}

node *erase(node *x, int v) {
    node *l;
    node *r;
    tie(l, r) = split(x, v);
    node *nl;
    node *nr;
    tie(nl, nr) = split(l, v - 1);
    return merge(nl, r);
}

bool search(node *x, int v) {
    if (x == nil) return 0;
    if (x->v == v) {
        return 1;
    }
    else {
        if (x->v < v) {
            return search(x->r, v);
        }
        else return search(x->l, v);
    }
}

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

    gen = mt19937(time(nullptr));
    node *x = nil;

    int n;
    cin >> n;
    while (n--) {
        int t;
        int v;
        cin >> t >> v;
        if (t == 1) {
            if (search(x, v) == 0) {
                x = insert(x, v);
            }
        }
        else {
            if (t == 2) {
                if (search(x, v) == 1) {
                    x = erase(x, v);
                }
            }
            else {
                cout << search(x, v) << "\n";
            }
        }
    }

    return 0;
}