Cod sursa(job #2899477)

Utilizator neagamariaMaria Neaga-Budoiu neagamaria Data 8 mai 2022 20:55:58
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <iostream>
#include <fstream>
#include <set>

using namespace std;

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

string cerinta;
set <int> ab;
set<pair<int, pair<int, int>>> v;

void insereaza(int x)
{
    //daca elem. nu se gaseste in zeap
    if (ab.find(x)==ab.end())
    {
        ab.insert(x);
        auto it=ab.find(x);
        //daca exista predecesor in zeap
        if (it!=ab.begin())
        {
            auto st=it;
            st--;
            v.insert(make_pair(x-*st, make_pair(*st, x)));
        }
        auto dr=it;
        dr++;
        if (dr!=ab.end())
            v.insert(make_pair(*dr-x, make_pair(x, *dr)));
    }
}

void sterge(int x)
{
    auto it=ab.find(x);
    if(it==ab.end())
    {
        out<<"-1\n";
        return;
    }
    auto dr=it;
    auto st=it;
    auto it1=++it;
    if (it!=ab.begin() && it1!=ab.end())
    {
        st--;
        dr++;
        //adaug stanga lui x-dreapta lui x
        v.insert(make_pair(*dr-*st, make_pair(*st, *dr)));
        //sterg perechile x-predecesor x, x-succesor x
        v.erase(make_pair(x-*st, make_pair(*st, x)));
        v.erase(make_pair(*dr-x, make_pair(x, *dr)));
    }
    else
    {
        if(it!=ab.begin() && it==ab.end())
            v.erase(make_pair(x-*st, make_pair(*st, x)));

        else if (it==ab.begin() && it!=ab.end())
            v.erase(make_pair(*dr-x, make_pair(x, *dr)));
    }
    //sterg elementul x
    ab.erase(x);
}


void afla_minim()
{
    //daca am 0 sau un element in zeap, nu pot sa det. min.
    if(ab.size()<=1)
        out<<"-1\n";
    else
    {
        //minimul e primul din multimea v, pt ca v e ordonata
        out<<(*(v.begin())).first<<'\n';
    }
}

void afla_maxim()
{
    if (ab.size()<=1)
        out<<"-1\n";
    else
    {
        //maximul e diferenta distanta dintre ultimul si primul element
        out<<*(--(ab.end()))-*(ab.begin())<<'\n';
    }
}

int transformint(string s)
{
    int nr=0;
    int crt=2;
    while(cerinta[crt])
    {
        nr=nr*10+(cerinta[crt++]-'0');
    }

    return nr;
}


int main()
{
    int x;

    while(getline(in, cerinta))
    {
        if(cerinta[0]=='I')
        {
            x = transformint(cerinta);
            insereaza(x);
        }
        else
            if(cerinta[0]=='S')
            {
                x = transformint(cerinta);
                sterge(x);
            }
            else
                if(cerinta[0]=='C')
                {
                    x=transformint(cerinta);
                    if(ab.find(x)!=ab.end())
                        out<<"1\n";
                    else
                        out<<"0\n";
                }
                else
                    if(cerinta[1]=='I')
                        afla_minim();


                    //if(cerinta=="MAX")
                    else
                        afla_maxim();
    }

    return 0;
}