Cod sursa(job #2899195)

Utilizator neagamariaMaria Neaga-Budoiu neagamaria Data 8 mai 2022 10:05:52
Problema Zeap Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <iostream>
#include <fstream>
#include <set>

using namespace std;

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

string cerinta;
int x;
set <int> ab;
set<pair<int, pair<int, int>>> v;
//set<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)
{
    if(ab.find(x)==ab.end())
    {
        out<<-1<<"\n";
        return;
    }
    auto it=ab.find(x);
    auto dr=it;
    auto st=it;
    auto it1=++it;
    if (it!=ab.begin() && it1!=ab.end())
    {
        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)));
        //adaug stanga lui x-dreapta lui x
        v.insert(make_pair(*dr-*st, make_pair(*st, *dr)));
    }

    else
    {
        if(it!=ab.begin() && it==ab.end())
            v.erase(make_pair(x-*st, make_pair(*st, x)));

        if (it==ab.begin() && it!=ab.end())
            v.erase(make_pair(*dr-x, make_pair(x, *dr)));
    }
    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
        auto start=v.begin();
        auto s=*start;
        out<<s.first<<"\n";
    }
}

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


int main()
{
    while(in>>cerinta)
    {
        if(cerinta=="I")
        {
            in>>x;
            insereaza(x);
        }
        if(cerinta=="S")
        {
            in>>x;
            sterge(x);
        }

        if(cerinta=="C")
        {
            in>>x;
            if(ab.find(x)!=ab.end())
                out<<1<<"\n";
            else
                out<<0<<"\n";
        }

        if(cerinta=="MIN")
            afla_minim();


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

    return 0;
}