Cod sursa(job #134343)

Utilizator MariusMarius Stroe Marius Data 11 februarie 2008 15:09:38
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>

#include <map>
#include <set>
#include <vector>
#include <iterator>
#include <algorithm>

using namespace std;

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

set <int> myset;
map <int, int> mymap;

inline void read(char *p, int &n)
{
	for (; *p < '0' || *p > '9'; ++ p) ;
	for (n = 0; '0' <= *p && *p <= '9'; ++ p)
		n = n * 10 + (*p - '0');
}

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

	pair <set <int>::iterator, bool> ret;
	set <int>::iterator it, itup, itlow, last;

	int n;

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

	while (fgets(buffer, 16, fi))
	{
		firstch = buffer[0];
		secondch = buffer[1];

		if (firstch == 'I')
		{
			read(buffer, n);
			ret = myset.insert(n);
			if (ret.second == true)
			{
				itup = ret.first, itlow = ret.first;
				itup ++;
				itlow --;
							
				if (ret.first != myset.begin() && itup != myset.end())
				{
					int &tmp = mymap[*itup - *itlow];
					if ((-- tmp) == 0)
						mymap.erase(*itup - *itlow);
				}
				if (itup != myset.end())
					mymap[*itup - n] ++;
				if (ret.first != myset.begin())
					mymap[n - *itlow] ++;
			}
		}
		if (firstch == 'S')
		{
			read(buffer, n);
			it = myset.find(n);
			if (it != myset.end())
			{
				itup = it, itlow = it;
				itup ++;
				itlow --;

				if (it != myset.begin())
				{
					int &tmp = mymap[n - *itlow];
					if ((-- tmp) == 0)
						mymap.erase(n - *itlow);
				}
				if (itup != myset.end())
				{
					int &tmp = mymap[*itup - n];
					if ((-- tmp) == 0)
						mymap.erase(*itup - n);
				}
				if (it != myset.begin() && itup != myset.end())
					mymap[*itup - *itlow] ++;
	
				myset.erase(it);
			}
			else
				fprintf(fo, "-1\n");
		}
		if (firstch == 'C')
		{
			read(buffer, n);
			fprintf(fo, "%d\n", (myset.find(n) != myset.end() ? 1 : 0));
		}
		if (firstch == 'M')
		{
			if (myset.size() > 1)
			{
				if (secondch == 'A')
					fprintf(fo, "%d\n", *(-- (last = myset.end())) - *myset.begin());
				else
					fprintf(fo, "%d\n", (*mymap.begin()).first);
			} 
			else
				fprintf(fo, "-1\n");
		}
	}

	fcloseall();

	return 0;
}