Cod sursa(job #2751832)

Utilizator XeinIonel-Alexandru Culea Xein Data 15 mai 2021 21:45:12
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <set>
#include <queue>
#include <utility>
#include <math.h>

using namespace std;

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

set<int> Elemente;
priority_queue< pair<int, pair<int, int>> > Dif_Min;  // (Dif, (x1, x2))

void INSEREAZA(int x)
{
    if(Elemente.find(x) == Elemente.end())
    {
        Elemente.insert(x);
        auto it = Elemente.find(x);
        if(it != Elemente.begin())
        {
            auto it_prev = it;
            --it_prev;
            int dif = abs(*it - *it_prev);
            Dif_Min.push(make_pair(-dif, make_pair(*it, *it_prev)));
        }
        if(it != --Elemente.end())
        {
            auto it_next = it;
            ++it_next;
            int dif = abs(*it_next - *it);
            Dif_Min.push(make_pair(-dif, make_pair(*it, *it_next)));
        }
    }
}

short STERGE(int x)
{
    if(Elemente.find(x) == Elemente.end())
        return -1;
    auto it = Elemente.find(x);
    if(it != Elemente.begin()  && it != --Elemente.end())
    {
        auto it_prev = it;
        auto it_next = it;
        --it_prev;
        ++it_next;
        Dif_Min.push(make_pair(-abs(*it_next - *it_prev), make_pair(*it_prev, *it_next)));
    }
    Elemente.erase(x);
    return 1;
}

short CAUTA(int x)
{
    if(Elemente.find(x) != Elemente.end())
        return 1;
    return 0;
}

int MAX_DIF()
{
    if(Elemente.size() < 2)
        return -1;
    return *(--Elemente.end()) - *Elemente.begin();
}

int MIN_DIF()
{
    if(Elemente.size() < 2)
        return -1;
    while(Elemente.find(Dif_Min.top().second.first) == Elemente.end() || Elemente.find(Dif_Min.top().second.second) == Elemente.end())
        Dif_Min.pop();
    return -Dif_Min.top().first;
}

int main()
{
    int NR;
    char Op[4];
    f >> Op;
    while(f.good())
    {
        if(Op[0] == 'M')
        {
            if(Op[1] == 'I')
                g << MIN_DIF() << '\n';
            else
                g << MAX_DIF() << '\n';
        }
        else
        {
            f >> NR;
            if(Op[0] == 'I')
                INSEREAZA(NR);
            else if(Op[0] == 'S' && STERGE(NR) == -1)
                    g << -1 << '\n';
            else if(Op[0] == 'C')
                g << CAUTA(NR) << '\n';
        }
        f >> Op;
    }
    return 0;
}