Cod sursa(job #139)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 5 decembrie 2006 15:24:33
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <cstdio>
#include <set>

const int INF = 0x3f3f3f3f;

using namespace std;
set<int> S;
multiset<int> mdif;
char s[128];

void inline readnumber(int &i)
{
	char *p = s + 2; int k;
	for (; '0' > *p || *p > '9'; p++);
	for (k = 0; '0' <= *p && *p <= '9'; p++)
		k = k * 10 + *p - '0';
	i = k;
}

int main()
{
	freopen("zeap.in", "rt", stdin);
	freopen("zeap.out", "wt", stdout);
	S.clear(); mdif.clear();
	for (; fgets(s, 128, stdin); )
	{
		int i;
		set<int> :: iterator it, it2, it3;
		multiset<int> :: iterator tmp;
		if (s[0] == 'M')
		{
			if (S.size() < 2)
			{
				printf("-1\n");
				continue;
			}
			if (s[1] == 'A')
			{
				it = S.end(); it--;
				printf("%d\n", *it - *S.begin());
			}
			else
				printf("%d\n", *mdif.begin());
		}
		if (s[0] == 'I')
		{
			readnumber(i);
			if (S.find(i) != S.end()) continue;
			if (S.size() == 0)
			{
				S.insert(i);
				continue;
			}
			it = S.upper_bound(i);
			if (it != S.begin())
			{
				it2 = it; it2--;
				if (*it > i)
				{
					tmp = mdif.find( *it - *it2 );
					if (tmp != mdif.end())
						mdif.erase( tmp );
					if (*it - i < i - *it2)
						mdif.insert( *it - i );
					else
						mdif.insert( i - *it2 );
				}
				else
					mdif.insert( i - *it2 );
			}
			else
			{
				if (*it > i)
					mdif.insert( *it - i );
			}
			S.insert(i);
		}
		if (s[0] == 'C')
		{
			readnumber(i);
			printf("%d\n", (S.find(i) != S.end()));
		}
		if (s[0] == 'S')
		{
			readnumber(i);
			if (S.find(i) == S.end())
			{
				printf("-1\n");
				continue;
			}
			it = S.lower_bound(i);
			it2 = S.upper_bound(i);
			if (it != S.begin())
			{
				it3 = it; it3--;
				tmp = mdif.find( i - *it3 );
				if (tmp != mdif.end())
					mdif.erase( tmp );
				if (it2 != S.end())
				{
					tmp = mdif.find( *it2 - i );
					if (tmp != mdif.end())
						mdif.erase( tmp );
					mdif.insert( *it2 - *it3 );
				}
			}
			else
			{
				if (it2 != S.end())
				{
					tmp = mdif.find( *it2 - i );
					if (tmp != mdif.end())
						mdif.erase( tmp );
				}
			}
			S.erase( S.lower_bound( i ) );
		}
	}
	return 0;
}