Cod sursa(job #2751761)

Utilizator XeinIonel-Alexandru Culea Xein Data 15 mai 2021 19:15:09
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <set>
#include <unordered_set>
#include <queue>
#include <utility>
#include <math.h>

using namespace std;

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

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

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

short STERGE(int x)
{
    if(Exista_Elem.find(x) == Exista_Elem.end())
        return -1;
    Elemente.erase(x);
    Exista_Elem.erase(x);
    return 1;
}

short CAUTA(int x)
{
    if(Exista_Elem.find(x) != Exista_Elem.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(Exista_Elem.find(Dif_Min.top().second.first) == Exista_Elem.end() || Exista_Elem.find(Dif_Min.top().second.second) == Exista_Elem.end())
        Dif_Min.pop();
    return -Dif_Min.top().first;
}

int main()
{
    char op[4];
    int NR;
    f.getline(op, 4);
    while(f.good())
    {
        if(op[0] == 'M')
        {
            if(op[1] == 'I')
                g << MIN_DIF() << '\n';
            else
                g << MAX_DIF() << '\n';
        }
        else
        {
            NR = op[2] - '0';
            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.getline(op, 4);
    }
    return 0;
}