Cod sursa(job #2899227)

Utilizator iioaaana777Ghergu Ioana iioaaana777 Data 8 mai 2022 12:31:50
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>
#include <set>
#include <queue>
#include <math.h>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");

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

void inserare(int x)
{
    if(zeap.find(x) == zeap.end())
    {
        zeap.insert(x);
        auto it = zeap.find(x);
        if(it != zeap.begin())
        {
            auto p= it;
            --p;
            int d = abs(*it - *p);
            dif.push(make_pair(-d, make_pair(*it, *p)));
        }
        if(it != --zeap.end())
        {
            auto p = it;
            ++p;
            int d = abs(*p - *it);
            dif.push(make_pair(-d, make_pair(*it, *p)));
        }
    }
}

int stergere(int x)
{
    if(zeap.find(x) == zeap.end())
        return -1;
    auto it = zeap.find(x);
    if(it != zeap.begin()  && it != --zeap.end())
    {
        auto p = it;
        auto u = it;
        --p;
        ++u;
        dif.push(make_pair(-abs(*u - *p), make_pair(*p, *u)));
    }
    zeap.erase(x);
    return 1;
}

bool cautare(int x)
{
    if(zeap.find(x) != zeap.end())
        return 1;
    return 0;
}

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

int min_dif()
{
    if(zeap.size() < 2)
        return -1;
    while(zeap.find(dif.top().second.first) == zeap.end() || zeap.find(dif.top().second.second) == zeap.end())
        dif.pop();
    return -dif.top().first;
}

int main()
{
    int x;
    string op;
    while(fin >> op)

        if(op[1] == 'I')
            fout<<min_dif()<<"\n";
        else

        if(op[1] == 'A')
            fout<<max_dif()<<"\n";

        else
        {
            fin >> x;
            if(op[0] == 'I')
                inserare(x);
            else

            if(op[0] == 'S' && stergere(x) == -1)
                fout <<"-1\n";
            else

            if(op[0] == 'C')
                fout<<cautare(x)<<"\n";
        }

    return 0;
}