Cod sursa(job #2897403)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 3 mai 2022 17:23:34
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;

const int fake = 0x31313131;
struct Zeap {
    set<int> elems;
    multiset<int> diffs;

    int Sterge(int x) {
        if(elems.find(x) == elems.end()) return -1;

        auto it = elems.lower_bound(x);
        if(it != elems.begin() && it != prev(elems.end())) {
            auto prex = *(--it); ++it;
            auto postx = *(++it); --it;

            diffs.insert(postx - prex);
        }
        if(it != elems.begin()) {
            auto prex = *(--it); ++it;
            diffs.erase(diffs.lower_bound(x - prex));
        }
        if(it != prev(elems.end())) {
            auto postx = *(++it); --it;
            diffs.erase(diffs.lower_bound(postx - x));
        }

        elems.erase(x);

        return fake;
    }

    int Insereaza(int x) {
        if(elems.find(x) != elems.end()) return fake;

        elems.insert(x);
        auto it = elems.lower_bound(x);
        if(it != elems.begin() && it != prev(elems.end())) {
            auto prex = *(--it); ++it;
            auto postx = *(++it); --it;

            diffs.erase(diffs.lower_bound(postx - prex));
        }
        if(it != elems.begin()) {
            auto prex = *(--it); ++it;
            diffs.insert(x - prex);
        }
        if(it != prev(elems.end())) {
            auto postx = *(++it); --it;
            diffs.erase(postx - x);
        }

        return fake;
    }

    int Cauta(int x) {
        return elems.find(x) != elems.end();
    }

    int Max() {
        if(elems.size() < 2) return -1;
        auto itl = elems.end(); --itl;
        auto itr = elems.begin();

        return *itl - *itr;
    }

    int Min() {
        if(elems.size() < 2) return -1;
        return *diffs.begin();
    }
};

ifstream in("zeap.in");
ofstream out("zeap.out");
#define cin in
#define cout out

int main() {
    Zeap z;

    char t;
    while(cin >> t) {
        int ans = fake;
        if(t == 'I') {
            int num; cin >> num;
            ans = z.Insereaza(num);
        }
        if(t == 'S') {
            int num; cin >> num;
            ans = z.Sterge(num);
        }
        if(t == 'C') {
            int num; cin >> num;
            ans = z.Cauta(num);
        }
        if(t == 'M') {
            cin >> t >> t;
            if(t == 'X') {
                ans = z.Max();
            }
            else {
                ans = z.Min();
            }
        }

        if(ans != fake) cout << ans << '\n';
    }

    return 0;
}