Cod sursa(job #2898916)

Utilizator tiberiusss26Titiriga Tiberiu Nicolae tiberiusss26 Data 7 mai 2022 13:18:21
Problema Zeap Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.62 kb
#include <fstream>
#include <unordered_map>
#include <vector>
#include <set>
#include <cmath>

using namespace std;

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

set<long long> zeap, dif;
unordered_map<long long, long long> map;

int main() {
    string op;
    long long x, i = 0;

    while (fin >> op) {
        if (op == "I") {
            fin >> x;
            if (zeap.find(x) != zeap.end())
                continue;
            else {
                zeap.insert(x);
                i++;
            }
            if (zeap.size() >= 2) {
                auto crt = zeap.find(x);
                auto pred = crt;
                auto succ = crt;
                pred--;
                succ++;
                auto final = zeap.end();
                final--;
                if (crt != zeap.begin() && crt != final) {
                    dif.insert(abs(*crt - *pred));
                    dif.insert(abs(*succ - *crt));
                    map[abs(*crt - *pred)]++;
                    map[abs(*succ - *crt)]++;
                    if (map[abs(*succ - *pred)] == 1) {
                        dif.erase(abs(*succ - *pred));
                        map[abs(*succ - *pred)] = 0;
                    } else
                        map[abs(*succ - *pred)]--;
                } else if (crt != zeap.begin()) {
                    dif.insert(abs(*crt - *pred));
                    map[abs(*crt - *pred)]++;
                } else if (crt != final) {
                    dif.insert(abs(*crt - *succ));
                    map[abs(*crt - *succ)];
                }
            }
        } else if (op == "C") {
            fin >> x;
            if (zeap.find(x) != zeap.end())
                fout << 1 << "\n";
            else fout << 0 << "\n";
        } else if (op == "S") {
            fin >> x;
            if (zeap.find(x) == zeap.end())
                fout << -1 << "\n";
            else {
                auto crt = zeap.find(x);
                auto pred = crt;
                auto succ = crt;
                pred--;
                succ++;
                auto final = zeap.end();
                final--;
                if (crt != zeap.begin() && crt != final) {
                    if (map[abs(*crt - *pred)] == 1) {
                        dif.erase(abs(*crt - *pred));
                        map[abs(*crt - *pred)] = 0;
                    } else map[abs(*crt - *pred)]--;

                    if (map[abs(*crt - *succ)] == 1) {
                        dif.erase(abs(*crt - *succ));
                        map[abs(*crt - *succ)] = 0;
                    } else map[abs(*crt - *succ)]--;
                    dif.insert(abs(*succ - *pred));
                    map[abs(*succ - *pred)]++;
                } else if (crt != zeap.begin()) {
                    if (map[abs(*crt - *pred)] == 1) {
                        dif.erase(abs(*crt - *pred));
                        map[abs(*crt - *pred)] = 0;
                    } else map[abs(*crt - *pred)]--;
                } else if (crt != final) {
                    if (map[abs(*crt - *succ)] == 1) {
                        dif.erase(abs(*crt - *succ));
                        map[abs(*crt - *succ)] = 0;
                    } else map[abs(*crt - *succ)]--;
                }
                zeap.erase(x);
            }
        } else if (op == "MAX") {
            if (zeap.size() < 2)
                fout << -1 << "\n";
            else {
                fout << abs(*(--zeap.end()) - *zeap.begin()) << "\n";
            }
        } else if (op == "MIN") {
            if (zeap.size() < 2)
                fout << -1 << "\n";
            else fout << *dif.begin() << "\n";
        }
    }
    fin.close();
    fout.close();
}