Cod sursa(job #2750511)

Utilizator PaduraruCristianPaduraru Cristian Daniel PaduraruCristian Data 11 mai 2021 18:13:03
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;

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

bool cmp(const pair<int,int> &a,const pair<int,int> &b)
{
    return a.first - a.second > b.first - b.second;
}


set <int> s;
priority_queue < pair<int,int> , vector<pair<int,int>> , decltype(&cmp) > difs(cmp);

int main()
{
    char op;
    int x;
    while(f>>op)
    {
        if(op != 'M')
        {
            f>>x;
            if(op == 'I')
            {
                auto p = s.find(x);
                if(p == s.end())
                {
                    s.insert(x);
                    p = s.find(x);
                    if(p != s.begin())
                    {
                        auto q=p;
                        --q;
                        difs.push(make_pair(*p, *q));
                    }
                    auto q=p;
                    ++q;
                    if(q != s.end())
                    {
                        difs.push(make_pair(*q, *p));
                    }
                }

            }
            else if(op == 'S')
            {
                auto p = s.find(x);
                if(p == s.end())
                    g<<-1<<'\n';
                else
                {
                    auto q=p;
                    ++q;
                    if(p != s.begin() && q != s.end())
                    {
                        --p;
                        difs.push(make_pair(*q, *p));
                    }
                    s.erase(x);
                }
            }
            else
            {
                if(s.find(x)!=s.end())
                    g<<"1\n";
                else
                    g<<"0\n";
            }
        }
        else
        {
            f>>op;
            f>>op;
            if(op == 'X')
            {
                if(s.size()>=2)
                    g<< *(s.rbegin()) - *(s.begin())<<'\n';
                else
                    g<<"-1\n";
            }
            else
            {
                if(s.size()>=2)
                {
                    while(s.find(difs.top().first)==s.end() || s.find(difs.top().second)==s.end())
                        difs.pop();
                    g<<difs.top().first - difs.top().second<< '\n';
                }
                else
                    g<<"-1\n";
            }
        }
    }
    return 0;
}