Cod sursa(job #2898173)

Utilizator mirceaspPetcu Mircea mirceasp Data 6 mai 2022 11:41:53
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.11 kb
#include <fstream>
#include <set>
#include <iostream>
#include <string>
#include <cmath>
#include <unordered_map>
using namespace std;
set<long long >zeap;
set<long long> diferente;
unordered_map<long long, long long >v(100000000);
int main()
{
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    string operatie;
    long long nr;
    set<long long >::iterator curent,previos,nextp,l;
    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) {
                curent = zeap.find(nr);
                previos  = curent;
                nextp = curent;
                nextp++;previos--;
                l = zeap.end();
                l--;
                if(curent != zeap.begin() && curent != l) {
                    diferente.insert(abs(*curent - *nextp));
                    diferente.insert(abs(*curent - *previos));
                    v[abs(*curent - *nextp)]++;v[abs(*curent - *previos)]++;
                    if(v[abs(*nextp-*previos)] == 1) {
                        diferente.erase(abs(*nextp - *previos));
                        v[abs(*nextp - *previos)] = 0;
                    }
                    else v[abs(*nextp-*previos)]--;
                }
                else if(curent != zeap.begin()) {
                    diferente.insert(abs(*curent - *previos));
                    v[abs(*curent - *previos)]++;}
                else if(curent != l) {
                    diferente.insert(abs(*curent - *nextp));
                    v[abs(*curent - *nextp)]++;}
            }
        } else if(operatie == "C")
        {
            f>>nr;
            if(zeap.find(nr) != zeap.end())
                g<<1<<'\n';
            else
                g<<0<<'\n';
        } else if(operatie == "S")
        {
            f>>nr;
            if(zeap.find(nr) != zeap.end()) {
                curent = zeap.find(nr);
                previos = curent;
                nextp = curent;
                previos--;
                nextp ++;
                l = zeap.end();
                l--;
                if(curent != zeap.begin() && curent != l) {
                    if(v[abs(*curent - *nextp)] == 1) {
                        diferente.erase(abs(*curent - *nextp));
                        v[abs(*curent - *nextp)]=0;}
                    else v[abs(*curent - *nextp)]--;
                    if(v[abs(*curent - *previos)]== 1){
                        diferente.erase(abs(*curent - *previos));
                        v[abs(*curent - *previos)] = 0;}
                    else v[abs(*curent - *previos)]--;
                    diferente.insert(abs(*nextp-*previos));
                    v[abs(*nextp-*previos)]++;
                }
                else if(curent != zeap.begin()) {
                    if (v[abs(*curent - *previos)] == 1) {
                        diferente.erase(abs(*curent - *previos));
                        v[abs(*curent - *previos)] = 0;
                    }
                    else v[abs(*curent - *previos)]--;
                }
                else if(curent != l) {
                    if (v[abs(*curent - *nextp)] == 1) {
                        diferente.erase(abs(*curent - *nextp));
                        v[abs(*curent - *nextp)] = 0;
                    }
                    else v[abs(*curent - *nextp)]--;
                }
                    zeap.erase(nr);
            }
            else
                g<<-1<<'\n';
        } else if(operatie == "MAX") {
            if (zeap.size() < 2)
                g << -1 << '\n';
            else {
                l = zeap.end();
                l--;
                curent = zeap.begin();
                g<<abs(*l-*curent)<<'\n';
            }
        } else if(operatie == "MIN") {
            if(zeap.size()>=2) {
                long long minim = *diferente.begin();
                g << minim << '\n';
            } else g<<-1<<'\n';
        }

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