Cod sursa(job #134340)

Utilizator MariusMarius Stroe Marius Data 11 februarie 2008 14:44:44
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>

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

using namespace std;

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

set <int> myset;
multiset <int> mymultiset;

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)
{
	ifstream fin(iname);
	ofstream fout(oname);

	char buffer[16], firstch, secondch;

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

	int n;

	while (fin.getline(buffer, 16))
	{
		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())
					mymultiset.erase(mymultiset.find(*itup - *itlow));
				if (itup != myset.end())
					mymultiset.insert(*itup - n);
				if (ret.first != myset.begin())
					mymultiset.insert(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())
					mymultiset.erase(mymultiset.find(n - *itlow));
				if (itup != myset.end())
					mymultiset.erase(mymultiset.find(*itup - n));
				if (it != myset.begin() && itup != myset.end())
					mymultiset.insert(*itup - *itlow);
	
				myset.erase(it);
			}
			else
				fout << -1 << '\n';
		}
		if (firstch == 'C')
		{
			read(buffer, n);
			fout << (myset.find(n) != myset.end() ? 1 : 0) << '\n';
		}
		if (firstch == 'M')
		{
			if (myset.size() > 1)
			{
				if (secondch == 'A')
				{
					last = myset.end();
					last --;
					fout << *last - *myset.begin() << '\n';
				}
				else
					fout << *mymultiset.begin() << '\n';
			} 
			else
				fout << -1 << '\n';
		}
	}

	fin.close();
	fout.close();

	return 0;
}