Cod sursa(job #2668696)

Utilizator Ionut_neuer58Raducu Ioan Stefan Ionut_neuer58 Data 5 noiembrie 2020 10:38:56
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
#include <cstring>

using namespace std;

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

set <int> a, difs;
set<int>::iterator it, it2, it3;
int val1, val2, minn=2000000000;

void ins(int x)
{
    int val1, val2;
    a.insert(x);
    if(a.size()>=2)
    {
        it=upper_bound(a.begin(), a.end(), x);
        if(it==a.end())
        {
            advance(it, -1);
            val2=*it;
            advance(it, -1);
            val1=*it;
            difs.insert(val2-val1);
        }
        else if(it==a.begin())
        {
            val1=*it;
            advance(it, 1);
            val2=*it;
            difs.insert(val2-val1);
        }
        else
        {
            advance(it, -1);
            val1=*it;
            advance(it, 2);
            val2=*it;
            advance(it, -1);
            difs.erase(val2-val1);
            difs.insert(*it-val1), difs.insert(val2-*it);
        }
    }
}
bool searchh(int x)
{
    it=upper_bound(a.begin(), a.end(), x);
    advance(it, -1);
    return (*it==x);
}
void eras(int x)
{
    int val1, val2;
    it=upper_bound(a.begin(), a.end(), x);
    it2=it;
    advance(it, -1);
    if(*it==x)
    {
        if(a.size()<=2)
        {
            while(!difs.empty()) difs.erase(difs.begin());
            a.erase(x);
            return;
        }
        if(it2==a.end())
        {
            advance(it2, -2);
            difs.erase(*it-*it2);
            a.erase(x);
        }
        else if(it2==a.begin())
        {
            advance(it, 2);
            difs.erase(*it2-*it);
            a.erase(x);
        }
        else
        {
            it3=it;
            advance(it, -1);
            difs.erase(*it3-*it), difs.erase(*it2-*it3);
            difs.insert(*it2-*it);
            a.erase(it3);
        }
        a.erase(x);
    }
    else out<<"-1\n";
}
int getMaxim()
{
    it=a.end();
    advance(it, -1);
    return *it;
}
int getMinim()
{
    return *a.begin();
};
int maxim()
{
    if(a.size()<2) return -1;
    return getMaxim()-getMinim();
}
int minim()
{
    if(a.size()<2) return -1;
    return *difs.begin();
}

int main()
{
    char s[4];
    int x;
    while(in>>s)
    {
        if(!strcmp(s, "I")) in>>x, ins(x);
        else if(!strcmp(s, "S")) in>>x, eras(x);
        else if(!strcmp(s, "C")) in>>x, out<<searchh(x)<<'\n';
        else if(!strcmp(s, "MIN")) out<<minim()<<'\n';
        else out<<maxim()<<'\n';
    }
    return 0;
}