Cod sursa(job #3315735)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 15 octombrie 2025 19:44:17
Problema Zeap Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.15 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

int get_rand() {
    return abs((rand() << 15) + rand()) + 1;
}

struct treapnode {
    int value, pri;
    int minelem, maxelem, mindif;
    treapnode *l, *r;
    treapnode() {
        l = r = nullptr;
        minelem = mindif = 1e15;
        maxelem = value = pri = 0;
    }
    bool operator ==(const treapnode &other)const {
        return (value == other.value && pri == other.pri && minelem == other.minelem && maxelem == other.maxelem && mindif == other.mindif);
    }
    bool operator !=(const treapnode &other)const {
        return !(*this == other);
    }
}*root, *nill;

void rotateLeft(treapnode* &node) {
    treapnode* temp = node->l;
    node->l = temp->r;
    temp->r = node;
    node = temp;
}

void rotateRight(treapnode* &node) {
    treapnode* temp = node->r;
    node->r = temp->l;
    temp->l = node;
    node = temp;
}

void pull(treapnode* &node) {
    if (node == nill) return;
    node->maxelem = node->minelem = node->value;
    node->mindif = 1e15;
    if (node->l != nill) {
        node->minelem = node->l->minelem;
        node->mindif = min(node->mindif, node->l->mindif);
        node->mindif = min(node->mindif, node->value - node->l->maxelem);
    }
    if (node->r != nill) {
        node->maxelem = node->r->maxelem;
        node->mindif = min(node->mindif, node->r->mindif);
        node->mindif = min(node->mindif, node->r->minelem - node->value);
    }
}

void balance(treapnode* &node) {
    if (node == nill) return;
    if (node->pri < node->l->pri) {
        rotateLeft(node);
    }
    if (node->pri < node->r->pri) {
        rotateRight(node);
    }
    pull(node->l);
    pull(node->r);
    pull(node);
}

bool find(treapnode* &node, int val) {
    if (node == nill)
        return false;
    if (node->value == val)
        return true;
    if (val < node->value)
        return find(node->l, val);
    return find(node->r, val);
}

void insert(treapnode* &node, int val) {
    if (node == nill) {
        node = new treapnode();
        node->value = node->maxelem = node->minelem = val;
        node->mindif = 1e15;
        node->l = node->r = nill;
        node->pri = get_rand();
        return;
    }
    if (val < node->value)
        insert(node->l, val);
    else if (val > node->value)
        insert(node->r, val);
    balance(node);
}

void erase(treapnode* &node, int val) {
    if (val < node->value)
        erase(node->l, val);
    else if (val > node->value)
        erase(node->r, val);
    else {
        if (node->l == nill && node->r == nill) {
            delete node;
            node = nill;
            return;
        }
        if (node->l->pri < node->r->pri) {
            rotateRight(node);
        }
        else
            rotateLeft(node);
        erase(node, val);
    }
    balance(node);
}

signed main() {

    ifstream cin("zeap.in");
    ofstream cout("zeap.out");
    /*
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    */
    srand(time(0));
    nill = new treapnode();
    nill->pri = -1;
    nill->minelem = 1e15;
    nill->maxelem = -1;
    nill->mindif = 1e15;
    nill->l = nill->r = nullptr;
    root = nill;
    string s;
    while (cin >> s) {
        if (s == "I") {
            int x;
            cin >> x;
            if (find(root, x)) continue;
            insert(root, x);
        }
        else if (s == "S") {
            int x;
            cin >> x;
            if (find(root, x))
                erase(root, x);
            else
                cout << "-1\n";
        }
        else if (s == "C") {
            int x;
            cin >> x;
            cout << find(root, x) << '\n';
        }
        else if (s == "MIN") {
            if (root->mindif == 1e15)
                cout << "-1\n";
            else
                cout << root->mindif << '\n';
        }
        else {
            if (root->maxelem == 1e15)
                cout << "-1\n";
            else
                cout << root->maxelem - root->minelem << '\n';
        }
    }

    return 0;
}