Cod sursa(job #1431313)

Utilizator andreiiiiPopa Andrei andreiiii Data 9 mai 2015 10:28:44
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include <algorithm>
#include <fstream>
#include <ctime>

using namespace std;

class Node {
public:
    int key, pry;
    Node *left, *right;

    Node(int _key):
        key(_key), pry(get_random()), left(NULL), right(NULL) {}
private:
    int get_random() {
        return (rand() << 16) + rand();
    }
};

pair<Node*, Node*> split(Node *node, int val) {
    if (node == NULL)
        return make_pair((Node*) NULL, (Node*) NULL);

    if (val <= node->key) {
        pair<Node*, Node*> spl = split(node->left, val);
        node->left = spl.second;
        spl.second = node;
        return spl;
    } else {
        pair<Node*, Node*> spl = split(node->right, val);
        node->right = spl.first;
        spl.first = node;
        return spl;
    }
}

Node *merge(Node *left, Node *right) {
    if (left == NULL) return right;
    if (right == NULL) return left;

    if (left->pry > right->pry) {
        left->right = merge(left->right, right);
        return left;
    } else {
        right->left = merge(left, right->left);
        return right;
    }
}

bool find(Node *node, int val) {
    if (node == NULL) return false;

    if (val < node->key) return find(node->left, val);
    if (val > node->key) return find(node->right, val);
    return true;
}

Node *insert(Node *root, int val) {
    if (find(root, val)) return root;
    pair<Node*, Node*> spl = split(root, val);
    return merge(merge(spl.first, new Node(val)), spl.second);
}

Node *remove(Node *node, int val) {
    if (node == NULL) return NULL;

    if (val == node->key) {
        Node *aux = node;
        node = merge(node->left, node->right);
        delete aux;
        return node;
    } else if (val < node->key) {
        node->left = remove(node->left, val);
        return node;
    } else {
        node->right = remove(node->right, val);
        return node;
    }
}

int main()
{
    ifstream fin("hashuri.in");
    ofstream fout("hashuri.out");

    srand(time(0));

    int T;
    fin >> T;

    Node *root = NULL;
    while (T-- > 0) {
        int op, x;
        fin >> op >> x;

        if (op == 1) root = insert(root, x);
        else if (op == 2) root = remove(root, x);
        else fout << int(find(root, x)) << '\n';
    }

    fin.close();
    fout.close();
}