Cod sursa(job #462336)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 10 iunie 2010 15:06:32
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<fstream>
#include<algorithm>
#include<set>

//folosesc un set si un multiset 

using namespace std;

int cont;
ofstream g("zeap.out");
set <int> s;
multiset < int > ms; 


void sterge (int nr )
{
	int sw1=0;
	int sw2=0;
	set <int> :: iterator it,it1,it2;
	multiset <int> :: iterator it3;
	
	it=s.find(nr);
	if (it==s.end())
	{
		g<<"-1\n";
		return ;
	}
	
	cont--;
	if (it!=s.begin())
	{
		--it;
		it1=it;
		++it;
		sw1=1;
	}
	
	++it;
	if (it!=s.end())
	{
		sw2=1;
		it2=it;
	}
	--it;
	
	if (sw1 )	
		ms.erase (ms.find (*it-*it1));
	
	if (sw2)
	{
		ms.erase (ms.find(*it2-*it));
		if (sw1)
			ms.insert (*it2-*it1);
	}
	s.erase(it);
}

void baga (int nr )
{
	set <int> :: iterator it,it1,it2;
	multiset <int> :: iterator it3;
	int sw1=0;
	int sw2=0;
	
	it=s.find(nr);
	if (it==s.end())
	{
		s.insert(nr);
		cont++;
		it=s.find(nr);
		if (it!=s.begin())
		{
			--it;
			it1=it;
			++it;
			sw1=1;
		}
		
		++it;
		if (it!=s.end())
		{
			it2=it;
			sw2=1;
		}
		--it;
		
		if (sw1 && sw2)
			ms.erase(ms.find(*it2-*it1));
		
		if (sw1)
			ms.insert (*it-*it1);
		
		if (sw2)
			ms.insert (*it2-*it);
	}
}	
void citire ()
{
	int nr;
	multiset <int> :: iterator it2;
	set <int > :: iterator it;
	ifstream f("zeap.in");
	char sir[10];
	cont=0;
	while (f>>sir)
	{
		if (strlen(sir)==1)
		{
			f>>nr;
			if (sir[0]=='I')
				baga (nr);
			
			if (sir[0]=='S')
				sterge (nr);
			
			if (sir[0]=='C')
			{
				it=s.find(nr);
				if (it!=s.end())
					g<<"1\n";
				else
					g<<"0\n";
			}
		}
		else
		if (cont>=2)
			{
				if (sir[1]=='I')
					g<<*(ms.begin())<<"\n";
				else
				{
					it=s.end();
					it--;
					g<<*it-*(s.begin())<<"\n";
				}
			}	
		else
			g<<"-1\n";
	}
	f.close();
	g.close();
}	


int main()
{
	citire ();
	return 0;
}