Cod sursa(job #2446762)

Utilizator radustn92Radu Stancu radustn92 Data 10 august 2019 17:41:29
Problema Hashuri Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>

struct item {
    int key, priority;

    item* l;
    item* r;

    item() {
    }

    item(int _key, int _priority) {
        key = _key;
        priority = _priority;
        l = r = NULL;
    }
};
typedef item* pitem;

void split(pitem t, int key, pitem& l, pitem& r) {
    if (t == NULL) {
        l = r = NULL;
        return;
    }

    if (key < t -> key) {
        split(t -> l, key, l, t -> l), r = t;
    } else {
        split(t -> r, key, t -> r, r), l = t;
    }
}

void merge(pitem& t, pitem l, pitem r) {
    if (l == NULL || r == NULL) {
        t = (l == NULL) ? r : l;
        return;
    }

    if (l -> priority > r -> priority) {
        merge(l -> r, l -> r, r);
        t = l;
    } else {
        merge(r -> l, l, r -> l);
        t = r;
    }
}

void insert(pitem& t, pitem it) {
    if (t == NULL) {
        t = it;
        return;
    }
    if (it -> priority > t -> priority) {
        split(t, it -> key, it -> l, it -> r);
        t = it;
    } else if (it -> key < t -> key) {
        insert(t -> l, it);
    } else {
        insert(t -> r, it);
    }
}

pitem search(pitem t, int key) {
    if (t == NULL) {
        return NULL;
    }

    if (t -> key == key) {
        return t;
    }
    if (key < t -> key) {
        return search(t -> l, key);
    }
    return search(t -> r, key);
}

void erase(pitem& t, int key) {
    if (t == NULL) {
        return;
    }

    if (t -> key == key) {
        merge(t, t -> l, t -> r);
    } else if (key < t -> key) {
        erase(t -> l, key);
    } else {
        erase(t -> r, key);
    }
}

int main() {
    freopen("hashuri.in", "r", stdin);
    freopen("hashuri.out", "w", stdout);

    srand(time(0));
    pitem root = NULL;

    int operations, type, no;
    scanf("%d", &operations);
    for (int operation = 0; operation < operations; operation++) {
        scanf("%d%d", &type, &no);
        switch(type) {
            case 1: {
                pitem entry = search(root, no);
                if (entry == NULL) {
                    insert(root, new item(no, rand()));
                }
                break;
            }
            case 2: {
                erase(root, no);
                break;
            }
            case 3: {
                pitem entry = search(root, no);
                printf("%d\n", entry == NULL ? 0 : 1);
            }
        }
    }
    return 0;
}