Cod sursa(job #2899426)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 8 mai 2022 19:02:01
Problema Zeap Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <map>
#include <set>

using namespace std;

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

set<int>zeap;
map<int,int>minDif;
int minim=2*1e9;
void inserare(int val){
    zeap.insert(val);
    if(zeap.size()>1){
        auto valNext=zeap.upper_bound(val);
        if(valNext!=zeap.end()){
            int dif=*valNext-val;
            minDif[dif]++;
            if(dif<minim)
                minim=dif;
        }
        auto valPrev = zeap.lower_bound(val);
        if(valPrev!=zeap.begin()){
            int dif=val-*prev(valPrev);
            minDif[dif]++;
            if(dif<minim)
                minim=dif;
        }
    }
}
void stergere(int val){
    int a1=-1,a2=-1;
    if(zeap.find(val)==zeap.end()){
         out<<"-1\n";
         return;
    }
    if(zeap.size()>1){
        auto valNext=zeap.upper_bound(val);
        if(valNext!=zeap.end()){
            a1=*valNext;
        int dif=*valNext-val;
        minDif[dif]--;
        if(minDif[dif]==0)
            minDif.erase(minDif.find(dif));
        }
        auto valPrev=zeap.lower_bound(val);
        if(valPrev!=zeap.begin()){
            int dif=val-*prev(valPrev);
            a2=*prev(valPrev);
            minDif[dif]--;
            if(minDif[dif]==0)
                minDif.erase(minDif.find(dif));
        }
        if(a1!=-1 && a2!=-1)
            minDif[a1-a2]++;
        minim=minDif.begin()->first;
    }
    zeap.erase(val);
}
void cauta(int val){
    if(zeap.find(val)!=zeap.end()) {
        out << "1\n";
        return;
    }
    out<<"0\n";
}


int main() {
    string op;
    int val;
    while(in>>op){
        if(op=="I"){
            in>>val;
            inserare(val);
        }
        else if(op=="S"){
            in>>val;
            stergere(val);
        }
        else if(op=="C"){
            in>>val;
            cauta(val);
        }
        else if(op=="MIN"){
            out<<minim<<"\n";
        }
        else{
            out<<*(prev(zeap.end()))-*zeap.begin()<<"\n";
        }
    }
    return 0;
}