Cod sursa(job #2898476)

Utilizator ralucarRogoza Raluca ralucar Data 6 mai 2022 22:00:05
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <iostream>
#include <fstream>
#include <set>
#include <queue>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
set <int> zeap;
string operatie;
int valoare;
typedef pair<int,pair<int,int>>pereche;//diferentele a cate 2 nr si numerele din care le am obtinut o
priority_queue<pereche, vector<pereche>, greater<pereche>> perechi;//diferentele in ordine crescatoare

void inserare(int x)
{
    if(zeap.find(x) == zeap.end())//daca nu exista nr in zeap
    {
        zeap.insert(x);
        set <int>::iterator st=zeap.find(x)--;
        set <int>::iterator dr=st;
        //introduc diferentele dintre numarul dat si vecinii din stanga,respectiv dreapta
        if(st!=zeap.begin())
        {
            st--;
            perechi.push(make_pair(x-*st, make_pair(*st, x)));//formez perechile inserand numerele in ordine crescatoare
        }
        dr++;
        if(dr!=zeap.end())
        {
            perechi.push(make_pair(*dr-x, make_pair(x, *dr)));
        }
    }
}

void stergere(int x)
{
    if(zeap.find(x)==zeap.end())
        g<<"-1\n";
    else
    {
        set <int>::iterator i1=zeap.find(x), i2=i1;
        i2++;
        if(i1!=zeap.begin() && i2!=zeap.end())
        {
            i1--;
            perechi.push(make_pair(*i2-*i1,make_pair(*i1, *i2)));
        }
        zeap.erase(x);
    }
}

void cautare(int x)
{
    if(zeap.find(x)==zeap.end())
        g<<"0\n";
    else
        g<<"1\n";
}

void max_dif()
{
    if(zeap.size()<2)
        g<<"-1\n";
    else
    {
        set<int>::iterator p, u;
        p=zeap.begin();
        u=zeap.end();
        u--;
        g<<(*u-*p)<<'\n';
    }
}

void min_dif()
{
    if(zeap.size()<2)
        g<<"-1\n";
    else
    {
        //eliminare perechi cu noduri sterse
        while(zeap.find(perechi.top().second.first)==zeap.end() || zeap.find(perechi.top().second.second)==zeap.end())
            perechi.pop();
        g<<perechi.top().first<<'\n';
    }
}

int main()
{
    while(f>>operatie)
    {
        if(operatie=="I")
        {
            f>>valoare;
            inserare(valoare);
        }

        else if(operatie=="S")
        {
            f>>valoare;
            stergere(valoare);
        }
        else if(operatie=="C")
        {
            f>>valoare;
            cautare(valoare);
        }
        else if(operatie=="MAX")
            max_dif();
        else if(operatie=="MIN")
            min_dif();
    }
    return 0;
}