Cod sursa(job #2899516)

Utilizator DumilexLem-Rau Dumitru Alexandru Dumilex Data 8 mai 2022 21:43:15
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <iostream>
#include <fstream>
#include <map>
#include <set>
using namespace std;

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

map<int,int>mini;
set<int>zeap;
int minim=999999999,n;
string m;

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

void insereaza(int n)
{
    zeap.insert(n);
    if(zeap.size()>1)
    {
        //urmatoarea valoare
        auto uv=zeap.upper_bound(n);
        if(uv!=zeap.end())
        {
            int dif=*uv-n;
            mini[dif]++;
            if(dif<minim)
                minim=dif;
        }
        auto vp=zeap.lower_bound(n);
        if(vp!=zeap.begin())
        {
            int dif=n-*prev(vp);
            mini[dif]++;
            if(dif<minim)
                minim=dif;
        }
    }
}

void sterge(int n)
{
    int a=-1,b=-1;
    if(zeap.find(n)==zeap.end())
    {
        g<<"-1"<<"\n";
        return;
    }
    if(zeap.size()>1)
    {
        auto uv=zeap.upper_bound(n);
        if(uv!=zeap.end())
        {
            a=*uv;
            int dif=*uv-n;
            mini[dif]--;
            if(mini[dif]==0)
                mini.erase(mini.find(dif));
        }
        auto vp=zeap.lower_bound(n);
        if(vp!=zeap.begin()){
            int dif=n-*prev(vp);
            b=*prev(vp);
            mini[dif]--;
            if(mini[dif]==0)
                mini.erase(mini.find(dif));
        }
        if(a!=-1 && b!=-1)
            mini[a-b]++;
        minim=mini.begin()->first;
    }
    zeap.erase(n);
}

int main()
{
    while(f>>m)
    {
        if(m=="S")
        {
            f>>n;
            sterge(n);
        }
        else
        if(m=="C")
        {
            f>>n;
            cauta(n);
        }
        else
        if(m=="I")
        {
            f>>n;
            insereaza(n);
        }
        else
        if(m=="MIN")
        {
            if(zeap.size()>=2)
                g<<minim<<"\n";
            else
                g<<"-1"<<"\n";
        }
        else
        if(m=="MAX")
        {
            if(zeap.size()>=2)
                g<<*(prev(zeap.end()))-*zeap.begin();
            else
                g<<"-1"<<"\n";
        }

    }

    return 0;
}