Cod sursa(job #1747582)

Utilizator rangerChihai Mihai ranger Data 25 august 2016 10:46:00
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;

struct item{
    int key, prior;
    item * l, * r;
    item(){}
    item(int key) : key(key), prior((rand() << 16) ^ rand()), l(NULL), r(NULL) {}
};
using pitem = item*;
pitem root;
void split(pitem t, int x, pitem& l, pitem& r)
{
    if (!t)
        l = r = NULL;
    else if (x > t->key)
        split(t->r, x, t->r, r), l = t;
    else
        split(t->l, x,l, t->l), r = t;
}
void merge(pitem& t, pitem l, pitem r)
{
    if (!l || !r)
        t = l ? l : r;
    else if (l->prior > r->prior)
        merge(l->r, l->r, r), t = l;
    else
        merge(r->l, l, r->l), t = r;
}
int find(pitem t, int key)
{
    if (!t) return 0;
    if (t->key == key)
        return 1;
    return find(key <= t->key ? t->l : t->r, key);
}
void insert(pitem& t, pitem it)
{
    if (!t)
        t = it;
    else if (it->prior > t->prior)
        split(t, it->key, it->l, it->r), t = it;
    else
        insert(it->key < t->key ? t->l : t->r, it);
}
void erase(pitem& t, int key)
{
    if (t->key == key)
        merge(t, t->l, t->r);
    else
        erase(key < t->key ? t->l : t->r, key);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    srand(time(NULL));


freopen("hashuri.in","r",stdin);
freopen("hashuri.out","w",stdout);
    int t;
    scanf("%d", &t);

    while(t--)
    {
        int tip, val;
        scanf("%d %d", &tip, &val);
        int este = find(root, val);
        if (tip==1) { if (!este) insert(root, new item(val)); }
        if (tip==2) { if (este) erase(root, val); }
        if (tip==3) { printf("%d\n", este);  }
    }
}