Cod sursa(job #2751930)

Utilizator bogdan2405Strat Bogdan-Valentin bogdan2405 Data 16 mai 2021 04:33:21
Problema Zeap Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include<bits/stdc++.h>

using namespace std;

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

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

 set<int> zeap;
//set<int>::iterator it,succesor,predecesor;
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));
                
                
            }
           
   
}

void stergere(int val){
     if(zeap.count(val)==0){
                g<<-1<<"\n";
            }
            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);
            }
}

void cautare(int val){
    g<<zeap.count(val)<<'\n';
}

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

                
                g<<abs(*last-*first)<<'\n';
                
            }
}

void MinDif(){
    if(zeap.size()<2)
            cout<<-1<<'\n';
            else{
                    while(!(zeap.count(minDif.top().first)==1 && zeap.count(minDif.top().second)==1)){
                        minDif.pop(); 
                    }
                     g<<abs(minDif.top().first-minDif.top().second)<<'\n';
                
                
            }
}
int main(){
    int val,count=0,a,b;
    string operatie;
   
    while(f>>operatie){
        if(operatie=="I"){
            f>>val;
            insereaza(val);
          
        }
        else if(operatie=="S"){
            f>>val;
            stergere(val);
            
        }
        else if(operatie=="C"){
            f>>val;
            cautare(val);
        }
        else if(operatie=="MAX"){
            maxDif();
        }
        else if(operatie=="MIN"){
           MinDif();
            
        }
        //for(auto x: zeap){
           // cout<<x<<" ";
          
       // }
     
        
        }
    
    return 0;
}