Cod sursa(job #1545597)

Utilizator LegionHagiu Stefan Legion Data 6 decembrie 2015 21:15:38
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
bool functie(int& a, int& b)
{
	if (a > b)
	{
		return 1;
	}
	return 0;
}
int main()
{
	ifstream in("zeap.in");
	ofstream out("zeap.out");
	string c;
	std::set<int>::iterator it;
	vector<int> diferente;
	map<int, int> scaderi;
	set<int> b;
	int i;
	while (!in.eof())
	{
		in >> c;
		if (c == "I")
		{
			in >> i;
			if (b.empty())
			{
				it = b.insert(i).first;
				continue;
			}
			it=b.insert(i).first;
			if (it == b.begin())
			{
				diferente.push_back(abs(*it - *(++it)));
				push_heap(diferente.begin(), diferente.end(),functie);
			}
			else if (it == (--b.end()))
			{
				diferente.push_back(abs(*it - *(--it)));
				push_heap(diferente.begin(), diferente.end(), functie);
			}
			else
			{
				diferente.push_back(abs(*it - *(--it)));
				push_heap(diferente.begin(), diferente.end(), functie);
				diferente.push_back(abs(*it - *(++it)));
				push_heap(diferente.begin(), diferente.end(), functie);
			}
		}
		else if (c == "S")
		{
			in >> i;
			it = b.find(i);
			if (it == b.end())
			{
				out << "-1\n";
			}
			else
			{
				if (b.size() == 1)
				{
					b.erase(it);
					continue;
				}
				if (it == b.begin())
				{
					scaderi[abs(*it - *(++it))]++;
				}
				else if (it == (--b.end()))
				{
					scaderi[abs(*it - *(--it))]++;
				}
				else
				{
					scaderi[abs(*it - *(--it))]++;
					scaderi[abs(*it - *(++it))]++;
				}
				b.erase(it);
			}
		}
		else if (c == "C")
		{
			in >> i;
			it=b.find(i);
			if (it == b.end())
			{
				out << "0\n";
			}
			else
			{
				out << "1\n";
			}
		}
		else if (c == "MAX")
		{
			if (b.size() >= 2)
			{
				out << *(--b.end()) - *b.begin()<<"\n";
			}
			else
			{
				out << "-1\n";
			}
		}
		else
		{
			if (b.size() >= 2)
			{
				while (scaderi[diferente[0]] > 0)
				{
					scaderi[diferente[0]]--;
					pop_heap(diferente.begin(), diferente.end(),functie);
					diferente.pop_back();
				}
				out << diferente[0]<<"\n";
			}
			else
			{
				out << "-1\n";
			}
		}
	}
}