Cod sursa(job #2898287)

Utilizator stefanliciuLiciu Vasile-Stefan stefanliciu Data 6 mai 2022 16:06:04
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <iostream>
#include <set>
#include <fstream>
#include <string>

using namespace std;

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

set<int>numere;
set<int>difference;

void insereaza(set<int>&S, int element)
{
	if (S.size() == 0)
	{
		S.insert(element);
		return;
	}
	if (S.find(element) == S.end())
	{

		set<int>::iterator p1, p2;//p2 - elementul imediat mai mare ca element care se afla in set; p1 - element daca acesta se afla in set, altfel elementul imediat mai mic;
		p2 = S.lower_bound(element);
		p1 = p2; p1--;
		S.insert(element);

		if (p2 != S.begin() && p2 != S.end())
		{   
			difference.erase((*p2) - (*p1));
			difference.insert((*p2) - element);
			difference.insert((element)-(*p1));
		}

		else if (p2 == S.begin()) // element este cel mai mic element din set;
			difference.insert((*p2) - element);
		else if(p2 == S.end()) // element este cel mai mare element din set;
			difference.insert(element - (*p1));
	}
}

void sterge(set<int>&S, int element)
{
	if (S.size() == 0)
	{
		S.erase(element);
		return;
	}
	if (S.find(element) == S.end())
	{
		fout << "-1\n";
	}
	else
	{

		set<int>::iterator p2, p1;
		p2 = S.lower_bound(element); //element;
		p1 = p2, p1--;
		p2++;
		//Acum am in p2 elementul mai mare ca element si in p1 elementul mai mic ca element;
		if (S.find(element) != S.begin() && S.find(element) != S.end())
		{
			difference.insert((*p2) - (*p1));
			difference.erase(difference.find((*p2) - element));
			difference.erase(difference.find(element - (*p1)));
		}
		else if (S.find(element) == S.begin())
		{
			difference.erase((*p2) - element);
		}
		else
		{
			difference.erase(element - (*p1));
		}
		S.erase(element);

	}
}


int main()
{ 
	

	string sir;
	while (getline(fin,sir))
	{
		if (sir[0] == 'I')
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + int(sir[i] - '0');
			insereaza(numere, element);
		}
      
		else if (sir[0] == 'S')
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + int(sir[i] - '0');
			sterge(numere, element);
		}
		
		if (sir[0] == 'C')
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + int(sir[i] - '0');
			if (numere.find(element) != numere.end())
			{
				fout << "1\n";
			}
			else fout << "0\n";
		}
		else if (sir == "MAX")
		{
			set<int>::iterator end = numere.end();
			end--;
			fout << (*end) - (*numere.begin()) << '\n';
		}
		else if (sir == "MIN")
		{
			fout << *(difference.begin())<<'\n';

		}
	}
	
	return 0;
}