Cod sursa(job #3317696)

Utilizator Vasile_AndreiVasile Andrei Calin Vasile_Andrei Data 24 octombrie 2025 22:54:37
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda cex_01 Marime 2.47 kb
#include <bits/stdc++.h>

using namespace std;

constexpr int INF = 2e9;

struct Treap {
    Treap *l, *r;
    int key, prior;
    int mn, mx, min_diff;

    Treap(int key) 
        : l(), r(), key(key), prior(rand()),
          mn(key), mx(key), min_diff(INF) {}

    void push_up() {
        mn = mx = key;
        min_diff = INF;

        for (Treap *t : { l, r }) {
            if (!t) continue;
            mn = min(mn, t->mn);
            mx = max(mx, t->mx);
            min_diff = min(min_diff, t->min_diff);
            if (t->key < key) min_diff = min(min_diff, key - t->mx);
            else min_diff = min(min_diff, t->mn - key);
        }
    }
};

pair<Treap *, Treap *> split(Treap *t, int key) {
    if (!t) return { nullptr, nullptr };
    if (key < t->key) {
        auto[l, r] = split(t->l, key);
        t->l = r;
        t->push_up();
        return { l, t };
    } else {
        auto[l, r] = split(t->r, key);
        t->r = l;
        t->push_up();
        return { t, r };
    }
}

Treap * merge(Treap *l, Treap *r) {
    if (!l || !r) return l ?: r;
    if (l->prior > r->prior) {
        l->r = merge(l->r, r);
        l->push_up();
        return l;
    } else {
        r->l = merge(l, r->l);
        r->push_up();
        return r;
    }
}

Treap * insert(Treap *t, int key) {
    auto[l, r] = split(t, key);
    if (l && l->key == key) return merge(l, r);
    return merge(merge(l, new Treap(key)), r);
}

pair<Treap *, int> erase(Treap *t, int key) {
    auto[mid, r] = split(t, key);
    auto[l, _] = split(mid, key - 1);
    return { merge(l, r), !_ };
}

bool search(Treap *t, int key) {
    if (!t) return false;
    if (t->key == key) return true;
    return key < t->key ? search(t->l, key) : search(t->r, key);
}

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

    Treap *t = nullptr;

    while (!fin.eof()) {
        string str;
        fin >> str;

        int x;
        if (str == "I") {
            fin >> x;
            t = insert(t, x);
        } else if (str == "S") {
            fin >> x;
            auto p = erase(t, x);
            t = p.first;
            if (p.second) fout << "-1\n";
        } else if (str == "C") {
            fin >> x;
            fout << search(t, x) << '\n';
        } else if (str == "MAX") fout << t->mx - t->mn << '\n';
        else fout << t->min_diff << '\n';
    }

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