Cod sursa(job #339227)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 8 august 2009 22:19:35
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>

using namespace std;

#define file_in "zeap.in"
#define file_out "zeap.out"

#define Inf 0x3f3f3f3f

set<int> zeap;   
multiset<int> z;   
int nr;
char s[20];

void insert(int x)
{
	set<int> :: iterator it,i1,i2;
	
	if (zeap.size()==0)//nu contine niciun element
	{//il inserez
		zeap.insert(x);
		return ;
	}
	
	i2=zeap.lower_bound(x);     
    if (*i2==x)     
        return;     
    i1=i2;     
    if (i1!=zeap.begin())     
        --i1;     
    if (i2!=zeap.end())   
        z.insert(abs(*i2-x));      
    if (i1!=i2)   
        z.insert(abs(*i1-x));     
    zeap.insert(x);//insereaza     
}   


void sterge(int x)
{
	set<int> :: iterator it,it1,it2;   
    multiset<int> :: iterator a1,a2;   
    
	it=zeap.find(x);   
    
	if (it==zeap.end())//nu l-am gasit
	{   
        printf("-1\n");   
        return;   
    }   
	
    it1=it;   
    
	if (it1!=zeap.begin())   
        --it1;   
    it2=it;   
    ++it2;   
    if (it2!=zeap.end())   
        z.erase(z.find(abs(*it2-x)));   
	if (it1!=it)   
        z.erase(z.find(abs(x-*it1)));   
    
    if (it2!=zeap.end() && it1!=it)   
        z.insert(*it2-*it1);   
    zeap.erase(*it); //sterge  
} 

void cauta(int x)
{
	set<int> :: iterator it;   
    
	it=zeap.find(x);   
    if (it==zeap.end())
		printf("0\n");
	else
		printf("1\n");   
}   

void max_dif()
{
	set<int> :: iterator it,it2;   
    
    it=zeap.end();
	--it;   
    it2=zeap.begin();//ultimul-primul
	printf("%d\n", *it-*(zeap.begin()));   
}

void min_dif()
{
	 printf("%d\n",*(z.begin()));   
}

int main()
{
	int i,x;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);

	//memset(zeap,0,sizeof(zeap));
	nr=0;

	while(gets(s))
	{
		//gets(s);
		i=0;
		if (s[0]=='I')//insert
		{
			i=2;
			x=0;
			while(s[i]>='0' && s[i]<='9')
			{
				x=x*10+s[i]-'0';
				i++;
			}
			insert(x);
		}
		else
		if (s[0]=='S')//sterge
		{
			i=2;
			x=0;
			while(s[i]>='0' && s[i]<='9')
			{
				x=x*10+s[i]-'0';
				i++;
			}
			sterge(x);
				//printf("-1\n");

		}
		else
		if (s[0]=='C')//cauta
		{
			i=2;
			x=0;
			while(s[i]>='0' && s[i]<='9')
			{
				x=x*10+s[i]-'0';
				i++;
			}
			//printf("%ld\n", cauta(x));
			cauta(x);
		}
		else
		if (s[0]=='M' && s[1]=='A')//max
		{
			if (zeap.size()<2)
				printf("-1\n");
			else
				//printf("%d\n", max_dif());
				max_dif();
		}
		else
		if (s[0]=='M' && s[1]=='I')//min
        {
			if (zeap.size()<2)
				printf("-1\n");
			else
				//printf("%d\n", min_dif());
				min_dif();
		}
    }

	fclose(stdin);
	fclose(stdout);

	return 0;
}