Cod sursa(job #2898247)

Utilizator iulia.talpalariuIulia-Georgiana Talpalariu iulia.talpalariu Data 6 mai 2022 14:57:58
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.5 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <queue>
#include <vector>
#include <tuple>
#include <set>
std::ifstream fileIn ("zeap.in");
std::ofstream fileOut("zeap.out");

class my_greater  {
public:
  bool operator() ( std::tuple<int, int, int>& arg1,  std::tuple<int, int, int>& arg2) const
  {
    return std::get<0>(arg1) > std::get<0>(arg2);
    return false;
  }
};

typedef std::priority_queue<std::tuple<int, int, int>, std::vector<std::tuple<int, int, int>>, my_greater> pQ; // definesc pQ tip minHeap cu tuplu mai sus si regulile de comp

std::set<int> zeap; // pt operatiile I,S,C,MAX
pQ minDif; // minHEAP care are <diferenta,elem 1, elem2>// elem 1 si 2 sunt si in set

void inserare(int nr){
    zeap.insert(nr); // pun in set
    // pt min heap tb sa vad in set in stg si dr elem inserat
    std::set<int> ::iterator it;
    it = zeap.find(nr);
    std::set<int> ::iterator inainte(zeap.find(nr)), dupa(zeap.find(nr));
    inainte --;
    dupa ++;
    if(it != zeap.begin()) { //DACA elem nostru NU E PRIMUL IN zeap
        minDif.push(std::make_tuple(*(it)-*inainte, *it, *inainte));
        //std::cout << *(it)-*inainte<< *it << *inainte <<'\n';
    }

    if(it != --zeap.end()) { //DACA elem nostru NU E ULTIMUL IN zeap
        minDif.push(std::make_tuple(*dupa-*(it), *dupa, *it));
        //std::cout << *dupa-*(it) <<  *dupa <<  *it<<'\n';
    }





}


bool cautare(int nr) {
    if(zeap.find(nr) == zeap.end()) {
        return 0;
    }
    else {
        return 1;
    }
}



int difMin() {
    std::tuple<int,int,int> tuplu(minDif.top());

    while(!cautare(std::get<1>(tuplu)) || !cautare(std::get<2>(tuplu))) {
        minDif.pop();
        tuplu = minDif.top();
    }

    return std::get<0>(tuplu);

}


void stergere(int nr) {
    //atentie la stergere tb sa adaug diferente noi
    std::set<int> ::iterator it(zeap.find(nr)), inainte(zeap.find(nr)), dupa(zeap.find(nr));
    --inainte;
    ++dupa;
    zeap.erase(it); // il sterg
    //agaug diferenta succesor - predecesor in pQ minDif
    if(inainte != --zeap.begin()&& dupa != zeap.end()) { //DACA predecesorul si succesorul exista
        minDif.push(std::make_tuple(*dupa-*inainte, *inainte, *dupa));
        //std::cout << *dupa-*inainte<< *inainte<< *dupa<<'\n';
    }

    //std::cout << "sa vad daca chiar am sters" <<cautare(nr) << "\n";


}
int main(){

    char comanda;
    int arg;

    while(fileIn>>comanda) {

        //std::cout<< comanda<<'\n';

        switch (comanda){
            case 'I': {
                ///INSERARE
                fileIn >> arg;
                //std::cout <<"INSERARE "<< int(arg)<<'\n';
                inserare(arg);
                break;
            }
            case 'S': {
                ///STERGERE
                fileIn >> arg;
                //std::cout <<"STERGERE: "<< int(arg)<<'\n';
                if(!cautare(arg)) {
                    fileOut << "-1"<<'\n';
                    //std::cout << "-1";
                }
                else{
                    stergere(arg);
                }

                break;

            }
            case 'C': {
                ///CAUTARE
                fileIn >> arg;
                //std::cout <<"CAUTARE: "<< int(arg)<<'\n';
                //std::cout<<cautare(arg)<<'\n';
                fileOut << cautare(arg)<<'\n';

                break;

            }
            case 'M': {
                fileIn >> comanda;
                if(comanda=='I') {
                    ///MIN
                    //std::cout <<"MIN " <<'\n';
                    if(zeap.size() >= 2){
                            fileOut << difMin()<<'\n';
                            //std::cout << difMin();

                    }
                    else {
                        fileOut << "-1"<<'\n';
                        //std::cout << "-1";
                    }

                }
                else {///MAX
                        //std::cout <<"MAX " <<'\n';

                    if(zeap.size() >= 2){
                        //std::cout << *(--zeap.end()) - *(zeap.begin())<<'\n';
                        fileOut << *(--zeap.end()) - *(zeap.begin())<<'\n';

                    }
                    else {
                        fileOut << "-1"<<'\n';
                        //std::cout << "-1";
                    }

                    }
                break;

            }


        }

    }



    return 0;
}