Cod sursa(job #1690939)

Utilizator ArkinyStoica Alex Arkiny Data 16 aprilie 2016 12:37:41
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include<fstream>
#include<algorithm>
#include<set>
#include<stdlib.h>
#include<iostream>
#include<map>
using namespace std;

int v[50010], s[50010], m[50010];

ifstream in("zeap.in");
ofstream out("zeap.out");
int N, K;
multiset<int> dif;
set<int> Set;
int main()
{
	char c;
	int nr;
	while (in >> c)
	{
		if (c == 'I')
		{
			std::pair<std::set<int>::iterator, bool> ret;
			in >> nr;
			ret = Set.insert(nr);
			if (ret.second && Set.size()>1)
			{
				auto it = ret.first;
				if (it == Set.begin())
				{
					it++;
					dif.insert(abs(*it - *ret.first));
				}
				else
				{
					it = Set.end();
					--it;
					if (it == ret.first)
					{
						it--;
						dif.insert(abs(*it - *ret.first));
					}
					else
					{
						it = ret.first;
						++it;
						--ret.first;
						dif.erase(dif.find(abs(*it - *ret.first)));
						++ret.first;
						it = ret.first;
						++it;
						dif.insert(abs(*it - *ret.first));

						it = ret.first;
						--it;
						dif.insert(abs(*it - *ret.first));


					}
				}
			}

		}
		else if (c == 'S')
		{
			in >> nr;
			auto e = Set.find(nr);
			if (e != Set.end())
			{
				auto it = e;
				if (Set.size() > 1)
				{
					if (it == Set.begin())
					{
						it++;
						dif.erase(abs(*it - *e));
					}
					else
					{
						it = Set.end();
						--it;
						if (it == e)
						{
							it--;
							dif.erase(abs(*it - *e));
						}
						else
						{
							it = e;
							++it;
							dif.erase(dif.find(abs(*it - *e)));
							it = e;
							--it;
							dif.erase(dif.find(abs(*it - *e)));
							++e;
							dif.insert(abs(*it - *e));


						}
					}
				}
				Set.erase(nr);
			}
			else
				out << "-1\n";
		}
			else if (c == 'C')
			{
				in >> nr;
				if (Set.find(nr) == Set.end())
					out << "0\n";
				else
					out << "1\n";
			}
			else
			{
				in >> c;

				if (c == 'A')
				{
					if (Set.size() >= 2)
						out << abs(*(Set.rbegin()) - *(Set.begin())) << '\n';

					else
						out << "-1\n";
				}
				else if (c == 'I')
				{
					if (Set.size() >= 2)
					{
						out << *dif.begin() << '\n';
					}
					else
						out << "-1\n";
				}
				in >> c;
			}
	}

	return 0;
}