Cod sursa(job #3135667)

Utilizator sumithesumSumurduc Alexandru sumithesum Data 3 iunie 2023 23:14:39
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb

#include <bits/stdc++.h>

using namespace std;

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

set<int> s;
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> zona;

void INS(int x)
{
    if (s.count(x)==0)
    {
        s.insert(x);
        if (s.size() >= 2)
        {
            auto findx = s.find(x);
            if (findx != s.begin())
            {
                findx--;
                zona.push({abs(x - *findx), {*findx, x}});
            }
            findx = s.find(x);
            if (findx != s.end())
            {
                findx++;
                zona.push({abs(*findx - x), {*findx, x}});
            }
        }
    }
}

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

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

int MIN_DIFF()
{
    if(s.size()>=2)
    {
        while(s.count(zona.top().second.first) ==0 || s.count(zona.top().second.second) == 0)
            zona.pop();
        return zona.top().first;
    }
    return -1;
}

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

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

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