Cod sursa(job #130334)

Utilizator razvi9Jurca Razvan razvi9 Data 31 ianuarie 2008 20:41:51
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<cstdio>
#include<set>
using namespace std;
char op[100],*p;
int i,j,x,calc,val;
set<int> s;
multiset<int> dif;
set<int>::iterator i1,i2,i3;
multiset<int>::iterator i4;

using namespace std;
FILE*fin=fopen("zeap.in","r");

inline void valoare(){
	sscanf(op+2,"%d",&x);/*
	x=0;
	p=op+2;
	while(*p>='0'&&*p<='9')
	{x=x*10+*p-'0';p++;}*/}

int main()
{freopen("zeap.out","w",stdout);
 while(fgets(op,100,fin)){	 
	 switch(op[0]){
		 case 'I':{
			 valoare();
			 if(s.find(x)!=s.end()) break;
			 s.insert(x);
			 if(s.size()==1) {break;}
			 i1=s.upper_bound(x);
			 i2=i1;
			 i2--;
			 i3=i2;
			 if(i3!=s.begin())i3--;
			 if(i1!=s.end()){
				 if(i2!=s.begin()) {i4=dif.find(*i1-*i3);dif.erase(i4);}
				 dif.insert(*i1-*i2);}
			 if(i2!=s.begin()) dif.insert(*i2-*i3);}break;
		 case 'S':{
			 valoare();
			 i1=s.find(x);
			 if(i1==s.end()){printf("-1\n");break;}
			 i3=i2=i1;
			 if(i1!=s.begin())i1--;
			 i3++;
			 if(i2!=s.begin()){
				 if(i3!=s.end()) dif.insert(*i3-*i1);
				 i4=dif.find(*i2-*i1);dif.erase(i4);}
			 if(i3!=s.end()) {i4=dif.find(*i3-*i2);dif.erase(i4);}
			 s.erase(i2);}break;
		 case 'C':{
			 valoare();
			 if(s.find(x)!=s.end()) printf("1\n");
			 else printf("0\n");
				  }break;
		 case 'M':{
			 if(s.size()<2) {printf("-1\n");break;}
			 if(op[1]=='I') printf("%d\n",*dif.begin());
			 else {
				 i1=s.end();
				 i1--;
				 printf("%d\n",*i1-*s.begin());}
				  }break;
	 }
 }
 fclose(stdout);
 return 0;}