Cod sursa(job #2899414)

Utilizator AndreiBerbecaruBerbecaru-Iovan Andrei AndreiBerbecaru Data 8 mai 2022 18:25:55
Problema Zeap Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include<fstream>
#include<set>
#include<queue>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");

set<int> zeap;
priority_queue<pair<int, pair<int, int>>> mindif;
string operatii;
int n;

void insereaza(int x){

    if(zeap.count(x)==0){
        zeap.insert(x);
        auto st=zeap.find(x);
        auto dr=st;
        dr++;

        if(st!=zeap.begin()){
            st--;
            mindif.push(make_pair((-1)*abs(x-*st), make_pair(*st, x)));
        }

        if(dr!=zeap.end())
            mindif.push(make_pair((-1)*abs(*dr-x), make_pair(*dr, x)));
    }

}

int sterge(int x){

    if(zeap.count(x)!=0){
        auto poz=zeap.find(x);
        auto poz1=poz;
        poz1++;
        if(poz==zeap.begin() || poz1==zeap.end())
            zeap.erase(x);
        else{
            auto poz2=poz;
            poz2--;
            if(poz!=zeap.begin() && poz1!=zeap.end())
                mindif.push(make_pair((-1)*abs(*poz1-*poz2), make_pair(*poz1, *poz2)));
        }
    }
    else
        return -1;
}

int cauta(int x){
    return zeap.count(x);
}

int max_dif(){
    if(zeap.size()>=2){
        auto primul=zeap.begin();
        auto ultimul=zeap.end();
        ultimul--;
        return abs(*ultimul-*primul);
    }
    else
        return -1;
}

int min_dif(){
    if(zeap.size()>=2){
        while(zeap.find(mindif.top().second.first)==zeap.end() || zeap.find(mindif.top().second.second)==zeap.end())
            mindif.pop();

        return abs(mindif.top().first);

    }
    else
        return -1;
}

int main(){
    while(fin>>operatii){
        if(operatii=="I"){
            fin>>n;
            insereaza(n);
            continue;
        }

        if(operatii=="S"){
            fin>>n;
            if(sterge(n)==-1)
                fout<<sterge(n)<<"\n";
            continue;
        }

        if(operatii=="C"){
            fin>>n;
            fout<<cauta(n)<<"\n";
            continue;
        }

        if(operatii=="MAX"){
            fout<<max_dif()<<"\n";
            continue;
        }

        if(operatii=="MIN"){
            fout<<min_dif()<<"\n";
            continue;
        }
    }
}