Cod sursa(job #2751843)

Utilizator asdfsfafafafafafafafaJarca Andrei asdfsfafafafafafafafa Data 15 mai 2021 22:12:42
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <set>
#include <queue>
#include <fstream>
using namespace std;
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>>interval;
set<int>zeap;
void insereaza(int x)
{
    if(zeap.count(x)==0)
    {
        zeap.insert(x);
        if(zeap.size()>=2)
        {
            auto index_x=zeap.find(x);
            if(index_x!=zeap.begin())
            {
                auto index_stanga=index_x;
                index_stanga--;
                interval.push({abs(*index_stanga-x),{*index_stanga,x}});
            }
            auto index_dreapta=index_x;
            index_dreapta++;
            if(index_dreapta!=zeap.end())
                interval.push({abs(x-*index_dreapta),{x,*index_dreapta}});
        }
    }
}

int sterge(int x)
{
    if(zeap.count(x)==0)
        return -1;
    auto index_x=zeap.find(x);
    auto index_dreapta=index_x;
    index_dreapta++;
    auto index_stanga=index_x;
    index_stanga--;
    if(index_dreapta!=zeap.end() && index_x!=zeap.begin())
        interval.push({abs(*index_stanga- *index_dreapta),{*index_stanga,*index_dreapta}});
    zeap.erase(x);
    return 1;
}

int cautare(int x)
{
    if(zeap.count(x))
        return 1;
    return 0;
}

int max_dif()
{
    if(zeap.size()<2)
        return -1;
    auto sfarsit=zeap.end();
    sfarsit--;
    auto inceput=zeap.begin();
    return *sfarsit- *inceput;
}

int min_dif()
{
    if(zeap.size()<2)
        return -1;
    while(zeap.count(interval.top().second.first)==0 || zeap.count(interval.top().second.second)==0)
        interval.pop();
    return interval.top().first;
}

int main()
{
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    string op;
    int x;
    while(f>>op)
        if(op=="I")
        {
            f>>x;
            insereaza(x);
        }
        else if(op=="S")
        {
            f>>x;
            int value=sterge(x);
            if(value == -1)
                g<<-1<<"\n";
        }
        else if(op=="C")
        {
            f>>x;
            g<<cautare(x)<<"\n";
        }
        else if(op=="MAX")
            g<<max_dif()<<"\n";
        else
            g<<min_dif()<<"\n";
    return 0;
}