Cod sursa(job #1968135)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 17 aprilie 2017 15:11:44
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>

using namespace std;

struct Treap {
    int key;
    long long priority;
    Treap *left, *right;
};

Treap* emptyNode = new Treap{0, -1, NULL, NULL};

Treap* CreateNode(int value) {
    return new Treap{value, (1LL * rand() * RAND_MAX + rand()), emptyNode, emptyNode};
}

pair<Treap*, Treap*> Split(Treap* A, int value) {
    if(A == emptyNode)
        return make_pair(emptyNode, emptyNode);

    if(A->key <= value) {
        auto aux = Split(A->right, value);
        A->right = aux.first;
        return make_pair(A, aux.second);
    } else {
        auto aux = Split(A->left, value);
        A->left = aux.second;
        return make_pair(aux.first, A);
    }
}

Treap* Join(Treap* A, Treap* B) {
    if(A == emptyNode)
        return B;
    if(B == emptyNode)
        return A;

    if(A->priority > B->priority) {
        A->right = Join(A->right, B);
        return A;
    } else {
        B->left = Join(A, B->left);
        return B;
    }
}

Treap* Insert(Treap* node, int value) {
    pair<Treap*, Treap*> aux = Split(node, value);
    aux.first = Join(aux.first, CreateNode(value));
    return Join(aux.first, aux.second);
}

bool Find(Treap* A, int value) {
    if(A == emptyNode)
        return false;

    if(value < A->key)
        return Find(A->left, value);
    if(value > A->key)
        return Find(A->right, value);
    return true;
}

Treap* Erase(Treap* node, int value) {
    if(node == emptyNode)
        return emptyNode;

    if(node->key == value)
        return Join(node->left, node->right);
    if(node->key > value)
        node->left = Erase(node->left, value);
    else
        node->right = Erase(node->right, value);
    return node;
}

int main() {
    freopen("hashuri.in", "r", stdin);
    freopen("hashuri.out", "w", stdout);
    srand(time(0));
    Treap* root = emptyNode;

    int q;
    scanf("%d", &q);
    while(q--) {
        int opType, value;
        scanf("%d%d", &opType, &value);

        if(opType == 1)
            root = Insert(root, value);
        else if(opType == 2)
            root = Erase(root, value);
        else if(Find(root, value))
            puts("1");
        else
            puts("0");
    }
}