Cod sursa(job #1472896)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 17 august 2015 23:25:00
Problema Hashuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
/**
  *  Worg
  */
#include <ctime>
#include <cstdio>
#include <cstdlib>

#define inf 2000000000

using namespace std;
FILE *fin=freopen("hashuri.in","r",stdin);
FILE *fout=freopen("hashuri.out","w",stdout);

struct treap {

        int key, priority;
        treap *left, *right;
        treap(){}
        treap(int key, int priority, treap *left, treap *right) {

            this -> key = key, this -> priority = priority;
            this -> left = left, this -> right = right;
        }
} *root, *nil;

void set() {

    srand(unsigned(time(0)));
    nil = new treap(0, 0, NULL, NULL);
    root = nil;
}

void rotLeft(treap *&node) {

    treap *t = node -> left;
    node -> left = t -> right, t -> right = node;
    node = t;
}

void rotRight(treap *&node) {

    treap *t = node -> right;
    node -> right = t -> left, t -> left = node;
    node = t;
}

void balance(treap *&node) {

    if(node -> priority < node -> left -> priority)
        rotLeft(node);
    else if(node -> priority < node -> right -> priority)
        rotRight(node);
}

void insert(treap* &node, int key, int priority) {

    if(node == nil) {
        node = new treap(key, priority, nil, nil);
        return;
    }

    if(key < node -> key)
        insert(node -> left, key, priority);
    else if(key > node -> key)
        insert(node -> right, key, priority);
}

void erase(treap *&node, int key) {

    if(node == nil)
        return;
    if(node -> key > key)
        erase(node -> left, key);
    else if(node -> key < key)
        erase(node -> right, key);
    else {

        if(node -> left == nil && node -> right == nil)
            delete node, node = nil;
        else {
            (node -> left -> priority > node -> right -> priority) ? rotLeft(node) : rotRight(node);
            erase(node, key);
        }
    }
}

int search(treap *node, int key) {

    if(node == nil)
        return 0;
    if(key == node -> key)
        return 1;
    if(key < node -> key)
        return search(node -> left, key);
    else
        return search(node -> right, key);
}

int main() {

    set();
    int n, op, x;
    for(scanf("%d", &n); n; --n) {

        scanf("%d %d", &op, &x);
        if( op == 1 )
            insert(root, x, rand() + 1);
        if( op == 2 )
            erase(root, x);
        if( op == 3 )
            printf("%d\n", search(root, x));
    }
    return 0;
}