Pagini recente » Cod sursa (job #2675522) | Cod sursa (job #3005627) | Cod sursa (job #217318) | Cod sursa (job #3143273) | Cod sursa (job #2749962)
#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;
}