Cod sursa(job #2899359)

Utilizator anamaria_panait.10Panait Ana-Maria anamaria_panait.10 Data 8 mai 2022 16:27:28
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <set>

using namespace std;

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

#define mx 2147483647

set <int> zeap;
pair<int, pair<int, int>> dif_min;

void insereaza(int val){
    auto it = zeap.find(val);
    if (it == zeap.end()){
        zeap.insert(val);
        if(dif_min.first != mx){
            auto st = it;
            st--;
            if (it != zeap.begin() && val - *st < dif_min.first)
                dif_min = make_pair(val - *st, make_pair(val, *st));

            auto dr = it;
            dr++;
            if (dr != zeap.end() && *dr - val < dif_min.first)
                dif_min = make_pair(*dr - val, make_pair(*dr, val));
        }
    }
}

void sterge(int val){
    auto it = zeap.find(val);
    if(it == zeap.end()){
        out<<"-1\n";
    } else {
        if (val == dif_min.second.first || val == dif_min.second.second)
            dif_min = make_pair(mx, make_pair(-1, -1));
        zeap.erase(val);
    }
}


void min_dif(){
    if(zeap.size() < 2)
        out << "-1\n";
    else {
        if (dif_min.first == mx){
            for (auto it = ++zeap.begin(); it != zeap.end(); it++){
                auto st = it;
                st--;
                if (*it - *st < dif_min.first)
                    dif_min = make_pair(*it - *st, make_pair(*it, *st));

            }
        }
        out << dif_min.first << '\n';
    }
}

void max_dif(){
    if (zeap.size() < 2)
        out << "-1\n";
    else
        out <<*(--(zeap.end())) - *(zeap.begin())<<'\n';
}


int main()
{
    string operatie;
    dif_min = make_pair(mx, make_pair(-1, -1));
    while(in >> operatie){
        if(operatie == "I"){
            int val;
            in >> val;
            insereaza(val);
        } else if(operatie == "S"){
            int val;
            in >> val;
            sterge(val);
        } else if(operatie == "C"){
            int val;
            in >> val;
            if(zeap.find(val) != zeap.end())
                out << "1\n";
            else
                out << "0\n";
        } else if(operatie == "MAX"){
            max_dif();
        } else if(operatie == "MIN")
            min_dif();
    }

    return 0;
}