Cod sursa(job #2898428)

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

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()
{
	string sir;
	while (getline(fin, sir))
	{
		switch (sir[0])
		{
		case 'I':
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + sir[i] - '0';
			insereaza(S, element);
		}
		break;
		case 'S':
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + sir[i] - '0';
			sterge(S, element);
		}
		break;
		case 'C':
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + sir[i] - '0';
			if (S.find(element) != S.end())
			{
				fout << "1\n";
			}
			else fout << "0\n";
		}
		break;
		case 'M':
		{
			if (sir == "MAX")
			{
				if (S.size() < 2)
				{
					fout << "-1" << '\n';
				}
				else
				{
					fout << *(S.rbegin()) - (*S.begin()) << '\n';
				}
			}
			else if (sir == "MIN")
			{
				if (difference.size() == 0)
				{
					fout << "-1" << '\n';
				}
				else
				{
					fout << *(difference.begin()) << '\n';
				}
			}
		}
		break;
		}
	}
	return 0;
}