Cod sursa(job #1457215)

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

using namespace std;
typedef int var;


struct SkipList {

    #define MAXD 10
    #define INF 2e9

    struct nod {
        var val, sz;
        nod **leg;

        nod(var k, var sz) {
            this->sz = sz;
            val = k;
            leg = new nod*[sz];
        }
    };
    typedef nod* pnod;
    pnod root, nill;
    pnod stop[MAXD];

    SkipList() {
        root = new nod(-1, MAXD);
        nill = new nod(INF, 0);

        for(var d=0; d<MAXD; d++)
            root->leg[d] = nill;
    }

    pnod find(var val) {
        pnod p = root;
        for(var d=MAXD-1; d>=0; d--) {
            while(p->leg[d]->val < val)
                p = p->leg[d];
            stop[d] = p;
        }
        p = p->leg[0];
        if(p->val == val) return p;
        return NULL;
    }

    void insert(var val) {
        if(find(val)) return;

        var sz = 1;
        while(rand() % 2) sz++;
        sz = min(MAXD, sz);

        pnod p = new nod(val, sz);
        for(var d=0; d<sz; d++) {
            p->leg[d] = stop[d]->leg[d];
            stop[d]->leg[d] = p;
        }
    }

    void erase(var val) {
        pnod p = find(val);
        if(p == NULL) return;
        for(var d=0; d<p->sz; d++) {
            stop[d]->leg[d] = p->leg[d];
        }
        delete[] p->leg;
        delete p;
    }
};
SkipList T;

#define DIM 100000
char buff[DIM];
var poz = DIM - 1;
void Read(var &a) {
    while(!isdigit(buff[poz]))
        if(++poz == DIM)
            fread(buff, 1, DIM, stdin), poz=0;
    a = 0;
    while(isdigit(buff[poz])) {
        a = a * 10 + buff[poz] - '0';
        if(++poz == DIM)
            fread(buff, 1, DIM, stdin), poz=0;
    }
}


int main() {

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

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