Cod sursa(job #2578846)

Utilizator alexradu04Radu Alexandru alexradu04 Data 11 martie 2020 17:15:57
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <set>
#include <map>

using namespace std;

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

string s;
int nr;

set <int> zeap;
map <int, int> dif;

int main() {
    while(cin >> s) {
        if(s.size() == 1)
            cin >> nr;
        if(s == "I") {
            if(zeap.find(nr) == zeap.end()) {
                zeap.insert(nr);
                auto it = zeap.find(nr);
                auto st = it, dr = it;
                if(it != zeap.begin())
                    st--;
                it++;
                if(it != zeap.end())
                    dr++;
                it--;
                if(st != it)
                    dif[*it - *st]++;
                if(dr != it)
                    dif[*dr - *it]++;
                if(st != it && dr != it) {
                    dif[*dr - *st]--;
                    if(!dif[*dr - *st])
                        dif.erase(*dr - *st);
                }
            }
        } else if(s == "S") {
            auto it = zeap.find(nr);
            if(it == zeap.end())
                cout << "-1\n";
            else {
                auto st = it, dr = it;
                if(it != zeap.begin())
                    st--;
                it++;
                if(it != zeap.end())
                    dr++;
                it--;
                if(st != it) {
                    dif[*it - *st]--;
                    if(!dif[*it - *st])
                        dif.erase(*it - *st);
                }
                if(dr != it) {
                    dif[*dr - *it]--;
                    if(!dif[*dr - *it])
                        dif.erase(*dr - *it);
                }
                if(st != it && dr != it)
                    dif[*dr - *st]++;
                zeap.erase(nr);
            }
        } else if(s == "C") {
            cout << (zeap.find(nr) != zeap.end()) << "\n";
        } else if(s == "MAX") {
            if(zeap.size() < 2)
                cout << "-1\n";
            else {
                auto it = zeap.end(); it--;
                cout << (*it - *zeap.begin()) << "\n";
            }
        } else {
            if(dif.empty())
                cout << "-1\n";
            else
                cout << dif.begin()->first << "\n";
        }
    }
    return 0;
}