Cod sursa(job #2750567)

Utilizator StarkillerCalin Stafie Starkiller Data 11 mai 2021 23:13:09
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pereche;

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

priority_queue <pair<int, pereche>, vector<pair<int, pereche>>, greater<pair<int, pereche>>> coada_cu_prioritati;
set <int> zeap;
string operatie;

void insereaza(int x)
{
    if(zeap.count(x) == 0)
    {
        zeap.insert(x);
        if(zeap.size() >= 2)
        {
            auto index_x = zeap.find(x);
            if(index_x != zeap.begin())
            {
                auto index_stanga = index_x;
                --index_stanga;
                coada_cu_prioritati.push({abs(*index_stanga - x), {*index_stanga, x}});
            }

            auto index_dreapta = index_x;
            ++index_dreapta;
            if(index_dreapta != zeap.end())
                coada_cu_prioritati.push({abs(x - *index_dreapta), {x, *index_dreapta}});
        }
    }
}

int sterge(int x)
{
    if(zeap.count(x) == 0)
        return -1;
    auto index_x = zeap.find(x);
    auto index_dreapta = index_x;
    ++index_dreapta;
    auto index_stanga = index_x;
    --index_stanga;
    if(index_dreapta != zeap.end() and index_x != zeap.begin())
        coada_cu_prioritati.push({abs(*index_stanga - *index_dreapta), {*index_stanga, *index_dreapta}});
    zeap.erase(x);
    return 1;
}

bool cauta(int x)
{
    if(zeap.count(x))
        return 1;
    return 0;
}

int max_dif()
{
    if(zeap.size() < 2)
        return -1;
    auto sfarsit = zeap.end();
    --sfarsit;
    auto inceput = zeap.begin();
    return *sfarsit - *inceput;
}

int min_dif()
{
    if(zeap.size() < 2)
        return -1;
    while(zeap.count(coada_cu_prioritati.top().second.first) == 0 or
                zeap.count(coada_cu_prioritati.top().second.second) == 0)
                coada_cu_prioritati.pop();
    return coada_cu_prioritati.top().first;
}

int main()
{
    int x;
    while(fin >> operatie)
        if(operatie == "I")
        {
            fin >> x;
            insereaza(x);
        }
        else
            if(operatie == "S")
            {
                fin >> x;
                int value = sterge(x);
                if(value == -1)
                    gout << -1 << '\n';
            }
            else
                if(operatie == "C")
                {
                    fin >> x;
                    gout << cauta(x) << '\n';
                }
                else
                    if(operatie == "MAX")
                        gout << max_dif() << '\n';

                    else     /// operatie == "MIN"
                        gout << min_dif() << '\n';

    return 0;
}