Cod sursa(job #3135605)

Utilizator Sumurduc_TeodoraSumurduc Teodora Sumurduc_Teodora Data 3 iunie 2023 19:56:05
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <iostream>
#include <string>
#include <queue>
#include <set>
#include <fstream>
using namespace std;

ifstream f("zeap.in");
ofstream g("zeap.out");
set<int> Zeap;
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;

void INSERARE(int x)
{
    if (Zeap.find(x) == Zeap.end())
    {
        Zeap.insert(x);
        if (Zeap.size() >= 2)
        {
            auto findx = Zeap.find(x);
            if (findx != Zeap.begin())
            {
                findx--;
                pq.push({abs(x - *findx), {*findx, x}});
            }
            findx = Zeap.find(x);
            if (findx != Zeap.end())
            {
                findx++;
                pq.push({abs(*findx - x), {*findx, x}});
            }
        }
    }
}

int STERGERE(int x)
{
    if (Zeap.find(x) == Zeap.end())
        return -1;
    else
    {
        auto findx = Zeap.find(x), find_urm = findx;
        find_urm++;
        if (findx == Zeap.begin() || find_urm == Zeap.end())
            Zeap.erase(x);
        else
        {
            auto left = findx;
            left--;
            if (find_urm != Zeap.end() && findx != Zeap.begin())
                pq.push({abs(*find_urm - *left), {*left, *find_urm}});
            Zeap.erase(x);
        }
        return 0;
    }
}

int CAUTARE(int x)
{
    return Zeap.count(x);
}

int MIN_DIFF()
{
    if(Zeap.size()>=2)
    {
        while(Zeap.find(pq.top().second.first) == Zeap.end() || Zeap.find(pq.top().second.second) == Zeap.end())
            pq.pop();
        return pq.top().first;
    }
    return -1;
}

int MAX_DIFF()
{
    if (Zeap.size()>=2)
        return *Zeap.rbegin()-*Zeap.begin();
    return -1;
}

int main()
{
    string s;
    int x;
    while (f >> s)
    {

        if (s == "I")
        {
            f >> x;
            INSERARE(x);
        }
        else if (s == "S")
        {
            f >> x;
            int result = STERGERE(x);
            if(result==-1)
            {
                g << result << endl;
            }
        }
        else if (s == "C")
        {
            f >> x;
            int result = CAUTARE(x);
            g << result << endl;
        }
        else if (s == "MIN")
        {
            int result = MIN_DIFF();
            g << result << endl;
        }
        else if (s == "MAX")
        {
            int result = MAX_DIFF();
            g << result << endl;
        }
    }
    return 0;
}