Cod sursa(job #134215)

Utilizator MariusMarius Stroe Marius Data 10 februarie 2008 22:13:51
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>

#include <set>
#include <iterator>
#include <algorithm>

using namespace std;

const char iname[] = "zeap.in";
const char oname[] = "zeap.out";

set <int> myset;
multiset <int> mymset;

inline int read(char *p)
{
	int n = 0;

	for (; *p < '0' || *p > '9'; ++ p) ;
	for (; '0' <= *p && *p <= '9'; ++ p)
		n = n * 10 + (*p - '0');
	return n;
}

int main(void)
{
	FILE *fi, *fo;
	char buffer[32];

	fi = fopen(iname, "r");
	fo = fopen(oname, "w");

	while (fgets(buffer, 32, fi))
	{
		char firstchar = buffer[0];
		char secondchar = buffer[1];

		if (firstchar == 'I')
		{
			int x = read(buffer);
			pair <set <int>::iterator, bool> ret = myset.insert(x);
			if (ret.second == true)
			{
				set <int>::iterator itup = ret.first, itlow = ret.first;
				int valup = (++ itup) != myset.end() ? *itup - x : 0;
				int vallow = (-- itlow) != ret.first ? x - *itlow : 0;
			
				if (valup && vallow)
					mymset.insert(min(valup, vallow));
				else if (valup)
					mymset.insert(valup);
				else if (vallow)
					mymset.insert(vallow);
			}
		}
		if (firstchar == 'S')
		{
			int x = read(buffer);
			set <int>::iterator it = myset.find(x);
			if (it != myset.end())
			{
				set <int>::iterator itup = it, itlow = it;
				int valup = (++ itup) != myset.end() ? *itup - x : 0;
				int vallow = (-- itlow) != it ? x - *itlow : 0;
				
				if (valup)
					mymset.erase(valup);
				if (vallow)
					mymset.erase(vallow);
				
				if (itup != myset.end() && itlow != it)
					mymset.insert(*itup - *itlow);

				myset.erase(it);
			}
			else
				fprintf(fo, "-1\n");
		}
		if (firstchar == 'C')
		{
			int x = read(buffer);
			fprintf(fo, "%d\n", (myset.find(x) != myset.end() ? 1 : 0));
		}
		if (firstchar == 'M')
		{
			if (myset.size() > 1)
			{
				if (secondchar == 'A')
				{
					set <int>::iterator last = myset.end();
					last --;
					fprintf(fo, "%d\n", *last - *myset.begin());
				}
				else
					fprintf(fo, "%d\n", *mymset.begin());
			} else
				fprintf(fo, "-1\n");
		}
	}

	fcloseall();

	return 0;
}