Cod sursa(job #1197271)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 11 iunie 2014 16:03:00
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.83 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>

using namespace std;

class Treap {
public:
    struct Node {
        Node *left, *right;
        int value, priority;
        Node(Node *_left, Node *_right,int _value, int _priority) {
            left = _left;
            right = _right;
            value = _value;
            priority = _priority;
        }
    };
    Node *root, *nil;
    Treap() {
        srand(time(NULL));
        nil = new Node(0, 0, 0, 0);
        nil->left = nil->right = nil;
        root = nil;
    }
    void insert(int _value) {
        _insert(root, _value, rand() + 1);
    }
    void erase(int _value) {
        _erase(root, _value);
    }
    bool find(int _value) {
        return _find(root, _value);
    }
private:
    inline void rotateLeft(Node *&node) {
        Node *aux = node->left;
        node->left = aux->right;
        aux->right = node;
        node = aux;
    }
    inline void rotateRight(Node *&node) {
        Node *aux = node->right;
        node->right = aux->left;
        aux->left = node;
        node = aux;
    }
    inline void balance(Node *&node) {
        if(node->left->priority > node->priority)
            rotateLeft(node);
        if(node->right->priority > node->priority)
            rotateRight(node);
    }
    void _insert(Node *&node, int value, int priority) {
        if(node == nil) {
            node = new Node(nil, nil, value, priority);
            return;
        }
        if(value < node->value)
            _insert(node->left, value, priority);
        else _insert(node->right, value, priority);
        balance(node);
    }
    bool _find(Node *&node, int value) {
        if(node == nil)
            return false;
        if(node->value == value)
            return true;
        if(node->value > value)
            return _find(node->left, value);
        return _find(node->right, value);
    }
    void _erase(Node *&node, int value) {
        if(node == nil)
            return ;
        if(node->value == value) {
            if(node->left == nil && node->right == nil) {
                delete(node);
                node = nil;
            }
            else if(node->left->priority > node->right->priority) {
                rotateLeft(node);
                _erase(node->right, value);
            }
            else {
                rotateRight(node);
                _erase(node->left, value);
            }
        }
        else if(node->value > value)
            _erase(node->left, value);
        else _erase(node->right, value);
    }
};

Treap T;

int main() {
    ifstream fin("hashuri.in");
    ofstream fout("hashuri.out");
    int M;
    fin >> M;
    while(M --) {
        int op, x;
        fin >> op >> x;
        if(op == 1)
            T.insert(x);
        else if(op == 2)
            T.erase(x);
        else fout << T.find(x) << '\n';
    }
}