Pagini recente » Istoria paginii runda/teza11b/clasament | Cod sursa (job #1238745) | Cod sursa (job #1307444) | Rating ioana ferariu (ioanafery) | Cod sursa (job #2899098)
#include <fstream>
#include <set>
#include <unordered_set>
#include <cstring>
using namespace std;
pair<int, int> min_dif_pair = { -1, -1 }; // first = valoarea elementului mai mare, second = valoarea elementului mai mic
int min_dif(set<int>& s)
{
int min_dif = 2147483647;
for (set<int>::iterator iterator = s.begin(); iterator != prev(s.end()); iterator++) // prev(s.end()) ca sa ne oprim la penultimul element
if (*next(iterator) - *(iterator) < min_dif)
{
min_dif = *next(iterator) - *(iterator);
min_dif_pair = { *next(iterator), *(iterator) };
}
return min_dif;
}
int main()
{
FILE* file;
file = fopen("zeap.in", "r");
ofstream g("zeap.out");
set<int> zeap;
unordered_set<int> valori;
char instructiune[20];
int numar;
while (fgets(instructiune, 20, file))
{
if (instructiune[0] == 'I') // inserare
{
strcpy(instructiune, instructiune + 2);
numar = atoi(instructiune);
if (valori.insert(numar).second) // insert.second = false daca elementul exista deja in set
{
auto adresa = zeap.insert(numar).first; // insert.first = adresa
if (min_dif_pair.first != -1) // daca exista un minim precalculat, il actualizam (daca e necesar)
{
if (numar != *zeap.rbegin()) // daca nu e ultimul element, facem diferenta cu urmatorul
if (*next(adresa) - numar < min_dif_pair.first - min_dif_pair.second)
min_dif_pair = { *next(adresa), numar };
if (numar != *zeap.begin())
if (numar - *prev(adresa) < min_dif_pair.first - min_dif_pair.second)
min_dif_pair = { numar , *prev(adresa) };
}
}
}
else if (instructiune[0] == 'S') // stergere
{
strcpy(instructiune, instructiune + 2);
numar = atoi(instructiune);
if (valori.erase(numar)) // erase returneaza nr de elemente sterse
{
zeap.erase(numar);
if (min_dif_pair.first == numar || min_dif_pair.second == numar)
min_dif_pair = { -1, -1 }; // valoarea minima calculata nu mai e valida
}
else
g << "-1\n";
}
else if (instructiune[0] == 'C') // cautare
{
strcpy(instructiune, instructiune + 2);
numar = atoi(instructiune);
if (valori.find(numar) == valori.end())
g << "0\n";
else
g << "1\n";
}
else if (instructiune[1] == 'A') // max dif
{
if (zeap.size() >= 2)
g << *zeap.rbegin() - *zeap.begin() << "\n";
else
g << "-1\n";
}
else if (instructiune[1] == 'I') // min dif
{
if (zeap.size() >= 2)
{
if (min_dif_pair.first != -1)
g << min_dif_pair.first - min_dif_pair.second << "\n";
else
g << min_dif(zeap) << "\n";
}
else
g << "-1\n";
}
}
return 0;
}