Cod sursa(job #2899280)

Utilizator AdelaCorbeanuAdela Corbeanu AdelaCorbeanu Data 8 mai 2022 13:53:28
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <set>
#include <unordered_set>
#include <string>

std::ifstream fin("zeap.in");
std::ofstream fout("zeap.out");

std::set<int> zeap;
std::unordered_set<int> zeap_fast;

int main()
{
    int min1 = -1, min2 = -1;
//    fout << "meow";
    std::string op;
    while (fin >> op) {
        if (op == "MAX") fout << (zeap.size() > 1 ? *zeap.rbegin() - *zeap.begin() : -1) << '\n';
        else if (op == "MIN") {
//            fout << "min1 = " << min1 << "  min2 = " << min2 << '\n';
            if (zeap.size() < 2) fout << -1 << '\n';
            else if (min1 != -1 && min2 != -1) fout << min1 - min2 << '\n';
            else {
//                fout << "meow";
                long long dif = 1000000000000;
                auto prev = zeap.begin();
                for (auto it = next(prev); it != zeap.end(); ++it) {
//                    fout << *it - *prev << " ";
                    if (*it - *prev < dif) dif = *it - *prev, min1 = *it, min2 = *prev;
                    prev = it;
                }
                fout << dif << '\n';
            }
        }
        else {
            int x;
            fin >> x;

            if (op == "I") {
                if (zeap_fast.insert(x).second) {
                    auto ins = zeap.insert(x).first;
                    if (min1 != -1) {
                        if (x != *zeap.rbegin()) {
                            int dif = *next(ins) - *ins;
                            if (dif < min1 - min2) min1 = *next(ins), min2 = *ins;
                        }
                        if (x != *zeap.begin()) {
                            int dif = *ins - *prev(ins);
                            if (dif < min1 - min2) min1 = *ins, min2 = *prev(ins);
                        }
                    }
                }
            }
            else if (op == "S") {
                if (!zeap_fast.erase(x)) fout << -1 << '\n';
                else {
                    zeap.erase(x);
                    if (min1 == x || min2 == x) min1 = min2 = -1;
                }
            }
            else {
                if (zeap_fast.find(x) != zeap_fast.end()) fout << 1 << '\n';
                else fout << 0 << '\n';
            }
        }
    }
    return 0;
}