Cod sursa(job #221830)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 18 noiembrie 2008 12:37:03
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
#define oo 1000100000
using namespace std;
set<int> S;
multiset<int> Q;
void del(int val){
	set<int>::iterator it,it1,it2;
	multiset<int>::iterator a1,a2;
	it=S.find(val);
	if (it==S.end()){
		printf("-1\n");
		return;
	}
	it1=it;
	if (it1!=S.begin())
		--it1;
	it2=it;
	++it2;
	if (it1!=it)
		Q.erase(Q.find(abs(val-*it1)));
	if (it2!=S.end())
		Q.erase(Q.find(abs(*it2-val)));
	if (it2!=S.end() && it1!=it)
		Q.insert(*it2-*it1);
	S.erase(*it);
}
void insert(int val){
	set<int>::iterator i1,i2,it;
	if (S.size()==0){
		S.insert(val);
		return;
	}
	i2 = S.lower_bound(val);  
    if (*i2 == val)  
        return;  
    i1 = i2;  
    if (i1!=S.begin())  
        --i1;  
    if (i2!=S.end())
        Q.insert(abs(*i2-val));   
    if (i1!=i2)
        Q.insert(abs(*i1-val));  
    S.insert(val);  
}
void search(int val){
	set<int>::iterator it;
	it=S.find(val);
	it==S.end()?printf("0\n"):printf("1\n");
}
void MAX(){
	set<int>::iterator it,it2;
	if (S.size()<2){
		printf("-1\n");
		return;
	}
	it=S.end();--it;
	it2=S.begin();//printf("MAX %d %d\n",*it2,*it);
	printf("%d\n",*it-*(S.begin()));
}
void MIN(){
	set<int>::iterator it1,it2;
	if (S.size()<2){
		printf("-1\n");
		return;
	}
	printf("%d\n",*(Q.begin()));
}
main(){
	char s[30],type;
	int val,i;
	freopen("zeap.in","r",stdin);
	freopen("zeap.out","w",stdout);
	while (gets(s)){
		if (strcmp(s,"MAX")==0)
			MAX();
		else
			if (strcmp(s,"MIN")==0)
				MIN();
			else{
				type=s[0];val=0;
				for (i=2;s[i]>='0' && s[i]<='9';++i)
					val=val*10+s[i]-'0';
				if (type=='I')
					insert(val);
				else
					if (type=='S')
						del(val);
					else
						search(val);
			}
	}
}