Cod sursa(job #2899206)

Utilizator popescumateicalinPopescu Matei Calin popescumateicalin Data 8 mai 2022 11:16:18
Problema Zeap Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <set>
#include <string>
using namespace std;

#define MAX INT32_MAX

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

set<int> zeap;
pair<int, pair<int, int>> mindif;
string input;
int num;

void insert()
{
    in >> num;
    if (zeap.find(num) == zeap.end())
    {
        zeap.insert(num);
        auto it = zeap.find(num);
        if (it != zeap.begin())
        {
            auto stg = prev(it);
            if (num - *stg < mindif.first)
            {
                mindif.first = num - *stg;
                mindif.second.first = num;
                mindif.second.second = *stg;
            }
        }
        if (it != --zeap.end())
        {
            auto dr = next(it);
            if (*dr - num < mindif.first)
            {
                mindif.first = *dr - num;
                mindif.second.first = *dr;
                mindif.second.second = num;
            }
        }
    }
}

void sterge()
{
    in >> num;
    auto it = zeap.find(num);
    if (it == zeap.end())
        out << "-1\n";
    else
    {
        if (num == mindif.second.first || num == mindif.second.second)
        {
            mindif.first = MAX;
            mindif.second = {-1, -1};
        }
        zeap.erase(num);
    }
}

void cauta()
{
    in >> num;
    if (zeap.find(num) == zeap.end())
        out << "0\n";
    else
        out << "1\n";
}

void maxdif()
{
    if (zeap.size() < 2)
        out << "-1\n";
    else
        out << *(--zeap.end()) - *(zeap.begin()) << '\n';
}

void min_dif()
{
    if (zeap.size() < 2)
        out << "-1\n";
    else
    {
        if (mindif.first == MAX)
        {
            for (auto it = ++zeap.begin(); it != zeap.end(); it++)
            {
                if (*it - *prev(it) < mindif.first)
                {
                    mindif.first = *it - *prev(it);
                    mindif.second.first = *it;
                    mindif.second.second = *prev(it);
                }
            }
        }
        out << mindif.first << '\n';
    }
}

int main()
{
    mindif.first = MAX;
    mindif.second = {-1, -1};
    while (in >> input)
    {
        if (input == "I")
            insert();
        if (input == "S")
            sterge();
        if (input == "C")
            cauta();
        if (input == "MAX")
            maxdif();
        if (input == "MIN")
            min_dif();
    }
    return 0;
}