Cod sursa(job #2898321)

Utilizator stefanliciuLiciu Vasile-Stefan stefanliciu Data 6 mai 2022 16:32:24
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 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.size() == 0)
	{
		S.insert(element);
		return;
	}

	set<int>::iterator  p2, p1;//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--;
	if (p2 != S.end() && (*p2) == element) return;
	if (p2 != S.begin() && p2 != S.end())
	{
	difference.erase(difference.find((*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));
	S.insert(element);
}

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

		set<int>::iterator p2, p1, p3;
		p2 = S.lower_bound(element); //returneaza element;
		p1 = p2, p1--;
		p3 = p2, p3++;
		p2++;
		//Acum am in p2 elementul mai mare ca element si in p1 elementul mai mic ca element;
		if (p2 == S.begin())
			difference.erase(difference.find((*p3) - element));
		else if (p3 == S.end())
		{
			difference.erase(element - (*p1));
		}
		else
		{
			difference.insert((*p3) - (*p1));
			difference.erase(difference.find((*p3) - element));
			difference.erase(difference.find(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(S, 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(S, element);
		}
		if (sir[0] == 'C')
		{
			int element = 0;
			for (int i = 2; i < sir.size(); ++i)
				element = element * 10 + int(sir[i] - '0');
			if (S.find(element) != S.end())
			{
				fout << "1\n";
			}
			else fout << "0\n";
		}
		else if (sir == "MAX")
		{
			set<int>::iterator end = S.end();
			end--;
			fout << (*end) - (* S.begin()) << '\n';
		}
		else if (sir == "MIN")
		{
			fout << *(difference.begin()) << '\n';

		}
	}

	return 0;
}