Pagini recente » Cod sursa (job #1702835) | Cod sursa (job #2648419) | Cod sursa (job #258054) | Cod sursa (job #3191739) | Cod sursa (job #589810)
Cod sursa(job #589810)
#include <set>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const char IN[]="zeap.in",OUT[]="zeap.out";
set<int> s;
multiset<int> dm;
void insert(int x)
{
set<int>::iterator it=upper_bound(s.begin(),s.end(),x);
if (it!=s.end()) dm.insert(*it-x);
if (it!=s.begin())
{
--it;
dm.insert(x-*it);
}
s.insert(x);
}
void del_multi(int x){
dm.erase(lower_bound(dm.begin(),dm.end(),x));
}
int del(int x)
{
set<int>::iterator it=s.find(x),it2=s.end(),it3=s.end(),it4;
if (it==s.end()) return -1;
int c;
if (it!=s.end())
{
it2=it,++it2;
del_multi(*it2-*it);
}
if (it!=s.begin())
{
--it;
it3=it;
++it;
del_multi(*it-*it3);
}
s.erase(x);
it4=it2;--it4;
if (it2!=s.end() && it2!=s.begin()) dm.insert(c=(*it2-*it4));
it4=it3;--it4;
if (it4!=s.end()) dm.insert(c=(*it3-*it4));
return 0;
}
int query(int x)
{
return s.find(x)!=s.end();
}
int max_dif()
{
if (s.size()<2) return -1;
set<int>::iterator it=s.end();--it;
set<int>::iterator it2=s.begin();
return *it-*it2;
}
int min_dif(){
multiset<int>::iterator it=dm.begin();
return *it;
}
int main()
{
register char s[256];
register int x;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
while (gets(s))
{
switch(s[0])
{
case 'I':
sscanf(s+1,"%d",&x);
insert(x);
break;
case 'S':
sscanf(s+1,"%d",&x);
if (del(x)==-1)
printf("-1\n");
break;
case 'C':
sscanf(s+1,"%d",&x);
printf("%d\n",query(x));
break;
case 'M':
if (strncmp(s,"MAX",3)==0)
printf("%d\n",max_dif());
else
printf("%d\n",min_dif());
break;
}
}
return 0;
}