Cod sursa(job #2899214)

Utilizator neagamariaMaria Neaga-Budoiu neagamaria Data 8 mai 2022 11:51:47
Problema Zeap Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 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 main()
{
    int x;

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

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

        if(cerinta=="MIN")
        {
            afla_minim();
            continue;
        }


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

    return 0;
}