Cod sursa(job #1457190)

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

using namespace std;
typedef int var;


struct AVL {

    struct nod {
        var key, height;
        nod *ls, *ld;
        nod(var k, var h, nod *s, nod *d) {
            key = k; height = h;
            ls = s; ld = d;
        }
    };
    typedef nod* pnod;

    pnod root, nill;

    AVL() {
        nill = new nod(-1, 0, nill, nill);
        nill->ls = nill->ld = nill;
        root = nill;
    }

    void upd(pnod &p) {
        if(p != nill)
            p->height = max(p->ls->height, p->ld->height) + 1;
    }

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

    void balance(pnod &p) {
        upd(p);
        if(p->ls->height > p->ld->height + 1) {
            rot_right(p);
        } else if(p->ld->height > p->ls->height + 1) {
            rot_left(p);
        }
    }

    void ins(pnod &p, const var &key) {
        if(p == nill) {
            p = new nod(key, 1, nill, nill);
            return;
        }

             if(key < p->key) ins(p->ls, key);
        else if(key > p->key) ins(p->ld, key);

        balance(p);
    }
    void insert(var val) {
        ins(root, val);
    }

    void del(pnod &p, const var &key) {
        if(p == nill) return;

        if(key < p->key)      del(p->ls, key);
        else if(key > p->key) del(p->ld, key);
        else {
            if(p->ls == nill && p->ld == nill) {
                delete p, p = nill;
                return;
            }
            if(p->ls->height < p->ld->height) {
                rot_left(p);
            } else {
                rot_right(p);
            }
            del(p, key);
        }

        balance(p);
    }
    void erase(const var &key) {
        del(root, key);
    }

    pnod fnd(pnod &p, const var &key) {
        if(p == nill) return NULL;

        if(key < p->key) return fnd(p->ls, key);
        if(key > p->key) return fnd(p->ld, key);
        return p;
    }
    pnod find(const var &key) {
        return fnd(root, key);
    }

};
AVL 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;
}