Cod sursa(job #2897755)

Utilizator mirceaspPetcu Mircea mirceasp Data 4 mai 2022 19:21:06
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>
#include <set>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
set<long long >zeap;
set<long long> diferente;
int main()
{
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    string operatie;
    long long nr;
    long long i = 0;
    while (f>>operatie)
    {
        if(operatie == "I") {
            f >> nr;
            if (zeap.find(nr) != zeap.end())
                continue;
            else
                zeap.insert(nr);
            i++;
            if(zeap.size()>=2) {
                long long previosnr = *next(zeap.begin(), i - 2);
                diferente.insert((abs(nr-previosnr)));
            }
        } else if(operatie == "C")
        {
            f>>nr;
            if(zeap.find(nr) != zeap.end())
                g<<1<<'\n';
            else
                g<<0<<'\n';
        } else if(operatie == "S")
        {
            i--;
            f>>nr;
            if(zeap.find(nr) != zeap.end()) {
                set<long long >::iterator curent,previos,next;
                curent = zeap.find(nr);
                previos = next = curent;
                previos--;
                next ++;
                if(curent != diferente.begin() && curent != diferente.end()) {
                    diferente.erase(abs(*curent - *previos));
                    diferente.erase(abs(*curent-*next));
                } else if(curent != diferente.begin())
                    diferente.erase(abs(*curent-*previos));
                else
                    diferente.erase(abs(*curent-*next));


                zeap.erase(nr);
            }
            else
                g<<-1<<'\n';
        } else if(operatie == "MAX") {
            if (zeap.size() < 2)
                g << -1 << '\n';
            else {
                long long first = *next(zeap.begin(), 0);
                long long last = *next(zeap.begin(), zeap.size() - 1);
                g<<abs(last-first)<<'\n';
            }
        } else if(operatie == "MIN") {
            if(zeap.size()>=2) {
                long long minim = *next(diferente.begin(),0);
                g << minim << '\n';
            } else g<<-1<<'\n';
        }

    }
    f.close();g.close();
    return 0;
}