Cod sursa(job #2899098)

Utilizator Bogdan197Putineanu Bogdan Bogdan197 Data 7 mai 2022 20:06:53
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#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;
}