Cod sursa(job #2749962)

Utilizator ionut31Ioan Ionescu ionut31 Data 9 mai 2021 10:40:03
Problema Zeap Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <fstream>
#include <iostream>
#include <set>
#include <queue>
#include <string>

using namespace std;

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

//functia de inserare a unui element in zeap-ul Z
void insereaza(set<int> &Z,int x)
{
    if(!Z.count(x)) //testez daca Z nu il contine deja pe x
        Z.insert(x); //daca nu il contine deja, il adaug

}

//functia de stergere a unui element din zeap-ul Z(functia va returna 1 daca stergerea a reusit si -1 in caz contrat,
// adica daca x nu se afla in Z)
int sterge(set<int> &Z,int x)
{
    if(!Z.count(x)) //testez daca Z nu il contine pe x
        return -1;
    else
    {
        Z.erase(x);
        return 1;
    }
}

//functie care cauta elementul x in zeap-ul Z si returneaza 0 daca elementul nu exista si 1 daca exista
int cauta(set<int> &Z,int x)
{
    if(Z.count(x))
        return 1;
    else
        return 0;
}

//functie care returneaza diferenta in modul maxima dintre oricare doua elemente distincte din zeap-ul Z;
//daca nu exista cel putin doua elemente in zeap se returneaza -1;
int max_dif(set<int> &Z)
{
    //set-ul este implementat cu un arbore binar de cautare, asta inseamna ca primul element este cel mai mic,
    //iar ultimul element este cel mai mare(set-ul este ordonat)

    if(Z.size() < 2) //am cel mult un element, deci nu pot avea diferenta dintre 2 numere distincte
        return -1;
    else
    {
        set<int>::iterator prim = Z.begin(), ultim = Z.end();
        --ultim; //deoarece Z.end() intoarce prima adresa din afara setului
        return *ultim - *prim;
    }
}

//functie care returneaza diferenta in modul minima dintre oricare doua elemente distincte din zeap-ul Z;
//daca nu exista cel putin doua elemente in zeap se returneaza -1;
int min_dif(set<int> &Z)
{
    if(Z.size() < 2) //am cel mult un element, deci nu pot avea diferenta dintre 2 numere distincte
        return -1;
    else
    {
        set<int>::iterator it1 = Z.begin(), it2 = it1; //plec cu iteratorii de la inceputul setului
        int dif_min = 1000000001; //initializez diferenta minima cu o valoare foarte mare
        ++it2;//plasez it2 pe urmatoarea pozitie pt a face diferente de cate doua elemente consecutive

        for(; it2 != Z.end(); ++it1, ++it2)
        {
            int dif_c = *it2 - *it1; //dif_c = diferenta curenta
            if(dif_c < dif_min)
                dif_min = dif_c;
        }
        return dif_min;
    }
}

int main()
{
    set<int> Z;
    string s;
    int x;
    while(fin >> s)
    {
        if(s == "I")
        {
            fin >> x;
            insereaza(Z, x);
        }
        else if(s == "S")
        {
            fin >> x;
            int rez = sterge(Z, x) ;
            if(rez == -1)
                fout << "-1\n";
        }
        else if(s == "C")
        {
            fin >> x;
            fout << cauta(Z, x) << "\n";
        }
        else if(s == "MIN")
        {
            fout << min_dif(Z) << "\n";
        }
        else
        {
            fout << max_dif(Z) << "\n";
        }
    }
    return 0;
}