Cod sursa(job #3129654)

Utilizator victorstefan28Cucu Victor Stefan victorstefan28 Data 15 mai 2023 14:23:32
Problema Zeap Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <iostream>
#include <fstream>
#include <set>
#include <string>
#include <sstream>
#include <climits>
std::ifstream in("../zeap.in");
std::ofstream out("../zeap.out");

std::set<int> zeap;
std::pair<int, std::pair<int,int>> dif_mn;
///       valoare dif min   valorile din care este obt


void insert(int x)
{
    if(zeap.find(x) == zeap.end())
    {
        zeap.insert(x);
        auto itx = zeap.find(x);
        auto st = prev(itx);
        auto dr = next(itx);
        if(itx!=zeap.begin() && x - *st < dif_mn.first)
            dif_mn = std::make_pair(x - *st, std::make_pair(*st, x));
        if(dr!=zeap.end() && *dr - x < dif_mn.first)
            dif_mn = std::make_pair(*dr - x, std::make_pair(x, *dr));
    }

}

std::string sterge(int x)
{
    if(zeap.find(x) == zeap.end())
        return "-1";
    else
    {
        //auto it = zeap.find(x);
        zeap.erase(x);
        if(dif_mn.second.first == x || dif_mn.second.second == x)
            dif_mn = std::make_pair(INT_MAX, std::make_pair(0,0));

        /// daca nu mai exista niciun insert dupa delete, calculez diferenta minima in apelul dif min,
        /// pt eficienta.
        return "";
    }
}

std::string dif_min()
{
    if(zeap.size() < 2)
        return "-1";
    else if(dif_mn.first == INT_MAX)
    {
        for(auto i = next(zeap.begin()); i!=zeap.end(); i++)
        {
            auto st = prev(i);
            if(*i - *st < dif_mn.first)
                dif_mn = std::make_pair(*i - *st, std::make_pair(*i, *st));
        }
    }
    return std::to_string(dif_mn.first);
}
std::string dif_max()
{
    if(zeap.size() < 2)
        return "-1";
    else
        return std::to_string(*(zeap.rbegin()) - *(zeap.begin()));
}

int main()
{
    std::string op;
    dif_mn = std::make_pair(INT_MAX, std::make_pair(0,0));
    while(in>>op)
    {
        if(op == "I")
        {
            int x;
            in>>x;
            insert(x);
        }
        else if(op == "S")
        {
            int x;
            in>>x;
            auto rez = sterge(x);
            if(!rez.empty())
                out<<rez<<'\n';
        }
        else if(op == "MAX")
            out<<dif_max()<<'\n';
        else if(op == "MIN")
            out<<dif_min()<<'\n';
        else if(op == "C")
        {
            int x;
            in>>x;
            out<<(zeap.find(x) != zeap.end() ? "1" : "0")<<'\n';
        }
    }
    return 0;
}