Cod sursa(job #2898418)

Utilizator stefanliciuLiciu Vasile-Stefan stefanliciu Data 6 mai 2022 17:52:41
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <iostream>
#include <set>
#include <fstream>
#include <cstring>

using namespace std;

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

set<int>S;
multiset<int>difference;

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

	if (S.size() == 0)
	{
		S.insert(element);
		return;
	}
	
	if (element < *(S.begin()))
	{
		difference.insert(*(S.begin()) - element);
	}
	else if (element > *(S.rbegin()))
	{
		difference.insert(element - *(S.rbegin()));
	}
	else
	{
		set<int>::iterator p2 = S.upper_bound(element), p1;
		p1 = p2; --p1;
		difference.erase(difference.find(*(p2)-*(p1)));
		difference.insert(element - *(p1));
		difference.insert(*(p2)-element);
	}
	S.insert(element);
}

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

	if (S.size() == 1)
	{
		S.clear();
		return;
	}
	
	if (element == *(S.begin()))
	{
		S.erase(S.begin());
		difference.erase(difference.find(*(S.begin()) - element));
	}
	else if (element == *S.rbegin())
	{
		S.erase(S.find(*S.rbegin()));
		difference.erase(element - *S.rbegin());
	}
	else
	{
		set<int>::iterator p = S.find(element), p1, p2;
		p1 = p; --p1;
		p2 = p; ++p2;
		difference.insert(*p2 - *p1);
		difference.erase(difference.find(element - *p1));
		difference.erase(difference.find(*p2 - element));
		S.erase(p);
	}
}


int main()
{


	char sir[100];
	while (fin.good())
	{    
		fin.getline(sir, 100);
		if (sir[0] == 'I')
		{
			int element = 0;
			for (int i = 2; i < strlen(sir); ++i)
				element = element * 10 + sir[i] - '0';
			insereaza(S, element);
		}

		else if (sir[0] == 'S')
		{
			int element = 0;
			for (int i = 2; i < strlen(sir); ++i)
				element = element * 10 + sir[i] - '0';
			sterge(S, element);
		}
		else if (sir[0] == 'C')
		{
			int element = 0;
			for (int i = 2; i < strlen(sir); ++i)
				element = element * 10 + sir[i] - '0';
			if (S.find(element) != S.end())
			{
				fout << "1\n";
			}
			else fout << "0\n";
		}
		else if (sir[1] == 'A')
		{
			if (S.size() < 2)
			{
				fout << "-1" << '\n';
			}
			else
			{
				fout << *(S.rbegin()) - (*S.begin()) << '\n';
			}
		}
		else
		{
			if (difference.size() == 0)
			{
				fout << "-1" << '\n';
			}
			else
			{
				fout << *(difference.begin()) << '\n';
			}
		}
	}

	return 0;
}