Cod sursa(job #2983310)

Utilizator bem.andreiIceman bem.andrei Data 22 februarie 2023 10:06:47
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("zeap.in");
ofstream w("zeap.out");

set <int> zeap;
priority_queue<pair <int, pair<int, int>>> min_dif;

int make_number(string s)
{
    int x = 0, i = 2;
    while(s[i])
    {
        x = x * 10 + (s[i++] - '0');
    }
    return x;
}

void inserare(int x)
{
    zeap.insert(x);
    auto iterator = zeap.find(x);
    if(iterator != zeap.end())
    {
        auto before = iterator, after = iterator;
        before--;
        after++;
        min_dif.push({-abs(*iterator - *before), {*iterator, *before}});
        min_dif.push({-abs(*iterator - *after), {*iterator, *after}});
    }
}

void stergere(int x)
{
    auto iterator = zeap.find(x);
    if(zeap.find(x) == zeap.end())
    {
        w<<-1<<"\n";
    }
    else
    {
        auto after = iterator;
        after ++;
        min_dif.push({-abs(*after - *iterator), {*after, *iterator}});
        zeap.erase(x);
    }

}

void minim()
{

    while (!min_dif.empty() && ((min_dif.top().first == 0) || (zeap.find(min_dif.top().second.first) == zeap.end() || zeap.find(min_dif.top().second.second) == zeap.end())))
    {
        min_dif.pop();
    }
    w <<(-1) * min_dif.top().first << "\n";
}



int main()
{
    int x;
    string s;
    while(getline(r, s))
    {
        if(s[0] == 'I')
        {
            x = make_number(s);
            inserare(x);
        }
        if(s[0] == 'S')
        {
            x = make_number(s);
            stergere(x);
        }
        if(s[0] == 'C')
        {
            x = make_number(s);
            if(zeap.find(x) == zeap.end())
            {
                w<<0<<"\n";
            }
            else
            {
                w<<1<<"\n";
            }
        }
        if(s == "MIN")
        {
            if(zeap.size() < 2)
            {
                w<<-1<<"\n";
            }
            else
            {
                minim();
            }
        }
        if(s == "MAX")
        {
            if(zeap.size() < 2)
            {
                w<<-1<<"\n";
            }
            else
            {
                w<<*(--zeap.end()) - *(zeap.begin())<<'\n';
            }
        }
    }
    return 0;
}