Cod sursa(job #3242201)

Utilizator deerMohanu Dominic deer Data 9 septembrie 2024 19:59:07
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) int((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { fout << "YES" << endl; return; }
#define NO { fout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

using namespace std;
ifstream fin ("zeap.in");
ofstream fout ("zeap.out");
void solve_testcase() {
    string s;
    multiset<int>nr, dif;
    auto brr = [&](int x) {
        if (dif.find(x) != dif.end())
            dif.erase(dif.find(x));
    };
    auto insert = [&](int x) {
        if (!nr.empty()) {
            auto it = nr.lower_bound(x);
            auto it2 = nr.upper_bound(x);
            if (it != nr.begin())
                dif.insert(x - *prev(it));
            if (it2 != nr.end())
                dif.insert(*it2 - x);
            if (it != nr.begin() && it2 != nr.end())
               brr(*it2 - *prev(it));
        }
        nr.insert(x);
    };
    auto erase = [&](int x) {
        if (nr.find(x) != nr.end()) {
            if (nr.size() > 1) {
                auto it = nr.lower_bound(x);
                auto it2 = nr.upper_bound(x);
                if (it != nr.begin())
                    brr(x - *prev(it));
                if (it2 != nr.end())
                    brr(*it2 - x);
                if (it != nr.begin() && it2 != nr.end())
                    dif.insert(*it2 - *prev(it));
            }
            nr.erase(x);
            return;
        }
        fout << "-1\n";
    };
    auto get_max = [&] -> int {
        if (nr.size() >= 2)
            return *nr.rbegin() - *nr.begin();
        return -1;
    };
    auto get_min = [&] -> int {
       if (!dif.empty())
           return *dif.begin();
        return -1;
    };
    auto search = [&](int x) -> int {
        return (nr.find(x) != nr.end());
    };
    while (getline(fin, s)) {
        if (s == "MAX")
            fout << get_max() << '\n';
        if (s == "MIN")
            fout << get_min() << '\n';
        if (s[0] == 'I')
            insert(stoi(s.substr(2)));
        if (s[0] == 'S')
            erase(stoi(s.substr(2)));
        if (s[0] == 'C')
            fout << search(stoi(s.substr(2))) << "\n";
    }
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int t = 1;
    // cin >> t;
    while (t--)
        solve_testcase();
    return 0;
}