Cod sursa(job #130312)

Utilizator razvi9Jurca Razvan razvi9 Data 31 ianuarie 2008 20:04:16
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
#include<set>
using namespace std;
char op[50];
int i,j,x,calc,val;
set<int> s;
multiset<int> dif;
set<int>::iterator i1,i2,i3;
multiset<int>::iterator id;

using namespace std;

inline void valoare(){
	x=0,j=1;
	while(op[j]==' ') j++;
	while(op[j])
	{x=x*10+op[j]-'0';j++;}}

int main()
{freopen("zeap.in","r",stdin);
 freopen("zeap.out","w",stdout);
 while(!feof(stdin)){
	 gets(op);
	 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;
			 i3--;
			 if(i1!=s.end() && i2!=s.begin()) dif.erase(*i1-*i3);
			 if(i1!=s.end()) 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;
			 i1--;
			 i3++;
			 if(i2!=s.begin() && i3!=s.end()) dif.insert(*i3-*i1);
			 if(i2!=s.begin()) {id=dif.find(*i2-*i1);dif.erase(id);}
			 if(i3!=s.end()) {id=dif.find(*i3-*i2);dif.erase(id);}
			 s.erase(x);}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");continue;}
			 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;}