Cod sursa(job #2750740)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 13 mai 2021 00:27:42
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <bits/stdc++.h>
#define stt first
#define drr second

using namespace std;

ofstream fout("zeap.out");

class CMP
{
public:
    bool operator() (pair<int, int> &a, pair<int, int> &b)
    {
        return (a.drr - a.stt) > (b.drr - b.stt);
    }
};

set<int> s;
priority_queue< pair<int, int>, vector< pair<int, int> >, CMP> q;

int Numar(char lin[])
{
    int i, nr = 0;
    for(i = 2; lin[i] != '\n'; i++)
        nr = nr * 10 + (lin[i] - '0');
    return nr;
}

void Insereaza(int x)
{
    if(s.count(x))
        return;

    s.insert(x);

    set<int>::iterator it = s.find(x);
    if(it != s.begin())
    {
        it--;
        q.push({*it, x});
    }

    set<int>::iterator it2 = s.find(x);
    it2++;
    if(it2 != s.end())
        q.push({x, *it2});
}

int Cauta(int x)
{
    return s.count(x);
}

int Sterge(int x)
{
    if(!Cauta(x))
        return 0;

    set<int>::iterator it = s.find(x);
    set<int>::iterator it2 = it;
    it2++;

    if(it != s.begin() && it != s.end())
    {
        it--;
        q.push({*it, *it2});
    }

    s.erase(s.find(x));
    return 1;
}

int MaxDif()
{
    if(s.size() < 2)
        return -1;
    return *s.rbegin() - *s.begin();
}

int MinDif() // :')
{
    if(s.size() < 2)
        return -1;

    while(!(s.count(q.top().stt) && s.count(q.top().drr)))
        q.pop();

    return q.top().drr - q.top().stt;
}

int main()
{
    int x;
    FILE * pFile;
    char lin[14];

    pFile = fopen("zeap.in", "r");
    while(fgets(lin, 14, pFile) != NULL)
        if(lin[0] == 'I')
        {
            x = Numar(lin);
            Insereaza(x);
        }
        else if(lin[0] == 'S')
        {
            x = Numar(lin);
            if(!Sterge(x))
                fout << -1 << "\n";
        }
        else if(lin[0] == 'C')
        {
            x = Numar(lin);
            fout << Cauta(x) << "\n";
        }
        else if(lin[1] == 'A') // max
        {
            fout << MaxDif() << "\n";
        }
        else // min
        {
            fout << MinDif() << "\n";
        }

    fclose (pFile);


    return 0;
}