Cod sursa(job #930076)

Utilizator raulstoinStoin Raul raulstoin Data 27 martie 2013 13:42:49
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include<fstream>
#include<set>
#include<algorithm>
#include<cstring>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
set<int> v;
set<int>::iterator it1,it2,it3,it;
char x[20];
int n;
int minim=(1<<30),code,val;
char *p;
inline void min_find()
{
	minim=(1<<30);
	if(v.size()<2)
		return;
	set<int>::iterator it1,it2;
	it1=it2=v.begin();
	it1++;
	for(;it1!=v.end();it1++,it2++)
		if(minim>(*it1)-(*it2))
		{
			minim=(*it1)-(*it2);
			val=(*it2);
		}
}
void decode()
{
	if(x[0]=='M')
	{
		code=4;
		return;
	}
	if(x[0]=='I')
		code=1;
	if(x[0]=='S')
		code=2;
	if(x[0]=='C')
		code=3;
	p=strchr(x,' ');
	n=atoi(p+1);
}
int main()
{
	while(fin.getline(x,20))
	{
		if(v.size()==2 && code<=2)
			min_find();
		decode();
		if(code==1)
		{
			pair<set<int>::iterator,bool> is;
			is=v.insert(n);
			if(is.second && v.size()>2)
			{
				it3=is.first;
				int d1=(1<<30),d2=(1<<30);
				if(it3==v.begin())
				{
					it2=it3++;
					d2=(*it3)-(*it2);
					if(minim>d2)
					{
						minim=d2;
						val=(*it2);
					}
					continue;
				}
				it2=it3++;
				it1=--it2;
				it2++;
				if(it3==v.end())
				{
					d1=(*it2)-(*it1);
					if(minim>d1)
					{
						minim=d1;
						val=(*it1);
					}
					continue;
				}
				d1=(*it2)-(*it1);
				d2=(*it3)-(*it2);
				if(d1<=d2)
				{
					d2=d1;
					it2=it1;
				}
				if(minim>d2)
				{
					minim=d2;
					val=(*it1);
				}
			}
			continue;
		}
		if(code==2)
		{
			if(v.empty())
			{
				fout<<-1<<'\n';
				continue;
			}
			it=v.end();
			it2=v.find(n);
			it--;
			if(it2!=v.end())
			{
				if(v.size()<2)
				{
					v.erase(it2);
					continue;
				}
				if(it2==it)
				{
					it1=--it2;
					it2++;
					if(val==(*it1))
					{
						v.erase(it2);
						min_find();
					}
					else
						v.erase(it2);
					continue;
				}
				it3=++it2;
				it2--;
				if(it2==v.begin())
				{
					if(val==(*it2))
					{
						v.erase(it2);
						min_find();
					}
					else
						v.erase(it2);
					continue;
				}
				it1=--it2;
				it2++;
				if(val==(*it1) || val==(*it2))
				{
					v.erase(it2);
					min_find();
				}
				else
					v.erase(it2);
			}
			else
				fout<<-1<<'\n';
			continue;
		}
		if(code==3)
		{
			fout<<(v.find(n)!=v.end())<<'\n';
			continue;
		}
		if(code==4)
		{
			if(v.size()<2)
			{
				fout<<-1<<'\n';
				continue;
			}
			if(x[1]=='A')
			{
				it1=v.end();
				it1--;
				it2=v.begin();
				fout<<(*it1)-(*it2)<<'\n';
			}
			else
				fout<<minim<<'\n';
		}
	}
	fin.close();
	fout.close();
	return 0;
}