Cod sursa(job #589810)

Utilizator crushackPopescu Silviu crushack Data 13 mai 2011 20:49:38
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <set>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const char IN[]="zeap.in",OUT[]="zeap.out";
set<int> s;
multiset<int> dm;

void insert(int x)
{	
	set<int>::iterator it=upper_bound(s.begin(),s.end(),x);
	if (it!=s.end()) dm.insert(*it-x);
	if (it!=s.begin())
	{	
		--it;
		dm.insert(x-*it);
	}
	
	s.insert(x);
}

void del_multi(int x){
	dm.erase(lower_bound(dm.begin(),dm.end(),x));
}

int del(int x)
{
	set<int>::iterator it=s.find(x),it2=s.end(),it3=s.end(),it4;
	if (it==s.end()) return -1;
	int c;
	if (it!=s.end()) 
		{
			it2=it,++it2;
			del_multi(*it2-*it);
	}
	if (it!=s.begin())
	{	
		--it;
		it3=it;
		++it;
		del_multi(*it-*it3);
	}
	
	s.erase(x);
	
	it4=it2;--it4;
	if (it2!=s.end() && it2!=s.begin()) dm.insert(c=(*it2-*it4));
	it4=it3;--it4;
	if (it4!=s.end()) dm.insert(c=(*it3-*it4));
	return 0;
}

int query(int x)
{
	return s.find(x)!=s.end();
}

int max_dif()
{
	if (s.size()<2) return -1;
	set<int>::iterator it=s.end();--it;
	set<int>::iterator it2=s.begin();
	return *it-*it2;
}

int min_dif(){
	multiset<int>::iterator it=dm.begin();
	return *it;
}

int main()
{
	register char s[256];
	register int x;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	while (gets(s))
	{
		switch(s[0])
		{
			case 'I':
				sscanf(s+1,"%d",&x);
				insert(x);
			break;
			case 'S':
				sscanf(s+1,"%d",&x);
				if (del(x)==-1)
					printf("-1\n");
			break;
			case 'C':
				sscanf(s+1,"%d",&x);
				printf("%d\n",query(x));
			break;
			case 'M':
				if (strncmp(s,"MAX",3)==0)
					printf("%d\n",max_dif());
				else
					printf("%d\n",min_dif());
			break;
		}
	}
	return 0;
}