Cod sursa(job #500878)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 13 noiembrie 2010 13:44:13
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <set>
#define Nmax 300002
#define INF 2147000000

using namespace std;

set< int > Set_min;
set< int, greater<int> > Set_max;
int N;
char s[15];

inline int Minim(int x,int y){ return x<y ? x:y; }
inline void insereaza(int nr){
	if( Set_min.find(nr) != Set_min.end() ) return;
	Set_min.insert(nr);
	Set_max.insert(nr);
}
inline void sterge(int nr){
	if( Set_min.find(nr) != Set_min.end() ){
		Set_min.erase(Set_min.find(nr));
		Set_max.erase(Set_max.find(nr));
	}
	else printf("%d\n",-1);
}
inline void cauta(int nr){
	if( Set_min.find(nr) != Set_min.end() )
		printf("%d\n",1);
	else printf("%d\n",0);
}
inline void max_dif(){
	if( Set_max.empty() || Set_max.size()==1 ){
		printf("%d\n",-1);
		return;
	}
	printf("%d\n",*Set_max.begin()-*Set_min.begin());
}
inline void min_dif(){
	int a,mn=INF;
	if( Set_max.empty() || Set_max.size()==1 ){
		printf("%d\n",-1);
		return;
	}
	
	a=*Set_min.begin();
	Set_min.erase(Set_min.begin());
	mn=Minim(mn,*Set_min.begin()-a);
	Set_min.insert(a);
	
	a=*Set_max.begin();
	Set_max.erase(Set_max.begin());
	mn=Minim(mn,a-*Set_max.begin());
	Set_max.insert(a);
	
	printf("%d\n",mn);
}

int main(){
	int i,nr;
	freopen("zeap.in","r",stdin);
	freopen("zeap.out","w",stdout);
	
	while( !feof(stdin) ){
		fgets(s,20,stdin);
		nr=0;
		for(i=0; s[i]>='A' && s[i]<='Z';) ++i;
		for(++i; s[i]>='0' && s[i]<='9';) nr=nr*10+s[i]-'0',++i;
		
		if(s[0]=='I') insereaza(nr);else
		if(s[0]=='S') sterge(nr); else
		if(s[0]=='C') cauta(nr); else
		if(s[1]=='A') max_dif();else
		if(s[1]=='I') min_dif();
		memset(s,0,sizeof(s));
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}