Cod sursa(job #2898497)

Utilizator andriciucandreeaAndriciuc Andreea andriciucandreea Data 6 mai 2022 23:45:11
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <set>
#include <string>
#include <iterator>

using namespace std;

ifstream fin("zeap.in");
ofstream fout("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)
{
    if(zeap.find(x) == zeap.end())
    {
        zeap.insert(x);
        if(zeap.size() >= 2)
        {
            auto iterator1 = zeap.find(x), iterator2 = zeap.find(x);
            if(iterator1 != zeap.end())
            {
                iterator1++;
                min_dif.push({abs(*iterator1-x)*(-1), {*iterator1, x}});
            }
            if(iterator2 != zeap.begin())
            {
                iterator2 --;
                min_dif.push({abs(*iterator2-x)*(-1), {*iterator2, x}});
            }
        }
    }
}

void stergere(int x)
{
    auto iterator = zeap.find(x);
    auto before = iterator, after = iterator;
    before --;
    after ++;
    if (after != zeap.end() and iterator != zeap.begin())
        min_dif.push({abs(*after - *before) * (-1), {*before, *after}});
    zeap.erase(x);
}

void minim()
{
    while(zeap.find(min_dif.top().second.first) == zeap.end() || zeap.find(min_dif.top().second.second) == zeap.end())
        min_dif.pop();
    fout <<(-1) * min_dif.top().first << "\n";
}

void maxim()
{
    auto st = zeap.begin(), dr = zeap.end();
    fout<<*(dr--) - *st<<'\n';
}

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