Cod sursa(job #2751797)

Utilizator XeinIonel-Alexandru Culea Xein Data 15 mai 2021 20:34:05
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <set>
#include <queue>
#include <unordered_set>
#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)
        {
            int x1 = x, x2 = *it2;
            if(x1 > x2)
                swap(x1, x2);

            dif = abs(x2 - x1);
            Dif_Min.push(make_pair(-dif, make_pair(x1, x2)));
        }
        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()
{
    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;
}