Cod sursa(job #2898163)

Utilizator adamemi02emanuel adam adamemi02 Data 6 mai 2022 11:31:34
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include<bits/stdc++.h>

using namespace std;

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

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

 set<int> zeap;
priority_queue<pair<int,int>, vector<pair<int,int>>, comparare> minDif;

void insereaza(int val){
      if(zeap.count(val)==0){
                 zeap.insert(val);
                set<int>::iterator succesor,predecesor;
                succesor=zeap.find(val);
                predecesor=zeap.find(val);
                succesor++;

                if(predecesor!=zeap.begin()){
                    predecesor--;
                    minDif.push(make_pair(val,*predecesor));
                }

                if(succesor!=zeap.end())
                    minDif.push(make_pair(*succesor,val));


            }


}

int stergere(int val){
     if(zeap.count(val)==0){
                return -1;
            }
            else{
                set<int>::iterator it1,it2;
                it1=zeap.find(val);
                it2=zeap.find(val);
                it2++;

                if(it2!=zeap.end() && it1!=zeap.begin()){
                    it1--;
                    minDif.push(make_pair(*it2,*it1));
                }

                zeap.erase(val);
                return 1;
            }
}

int cautare(int val){
   return zeap.count(val);
}

int maxDif(){
    if(zeap.size()<2)
            return -1;
            else{
                set<int>::iterator first,last;
                first=zeap.begin();
                last=zeap.end();
                last--;


                return abs(*last-*first);

            }
}

int MinDif(){
    if(zeap.size()<2)
            return -1;
            else{
                    while(!(zeap.count(minDif.top().first)==1 && zeap.count(minDif.top().second)==1)){
                        minDif.pop();
                    }
                     return abs(minDif.top().first-minDif.top().second);


            }
}
int main(){
    int val;
    string operatie;

    while(fin>>operatie){
        if(operatie=="I"){
            fin>>val;
            insereaza(val);

        }
        else if(operatie=="S"){
            fin>>val;
            if(stergere(val)==-1)
                fout<<-1<<'\n';

        }
        else if(operatie=="C"){
            fin>>val;
            fout<<cautare(val)<<'\n';
        }
        else if(operatie=="MAX"){
            fout<<maxDif()<<'\n';
        }
        else if(operatie=="MIN"){
           fout<<MinDif()<<'\n';

        }



        }


}