Pagini recente » Cod sursa (job #461179) | Cod sursa (job #2687553) | Cod sursa (job #2022201) | Cod sursa (job #3150305) | Cod sursa (job #129747)
Cod sursa(job #129747)
#include <stdio.h>
#include <math.h>
#include <set>
using namespace std;
#define infile "zeap.in"
#define outfile "zeap.out"
FILE *fin,*fout;
set <int> S;
set <unsigned long long> diff;
inline int min(int &x, int &y)
{
return (x<y)?x:y;
}
inline int max(int &x, int &y)
{
return (x>y)?x:y;
}
inline unsigned long long key(unsigned long long v1, unsigned long long v2)
{
return ((v2-v1)<<30)+v1;
}
inline void insert_diff(set<int>::iterator &i, set<int>::iterator &j)
{
int v1,v2;
v1=min(*i,*j);
v2=max(*i,*j);
diff.insert(key(v1,v2));
}
inline void erase_diff(set<int>::iterator &i, set<int>::iterator &j)
{
int v1,v2;
v1=min(*i,*j);
v2=max(*i,*j);
diff.erase(key(v1,v2));
}
inline void inserare(int &value)
{
pair <set<int>::iterator,bool> t;
set<int>::iterator prec,next;
t=S.insert(value);
if(t.second)
{
prec=next=t.first;
next++;
prec--;
if(t.first==S.begin())
if(next==S.end())
return;
else
insert_diff(t.first,next);
else
if(next==S.end())
insert_diff(t.first,prec);
else
{insert_diff(t.first,next);
insert_diff(t.first,prec);
erase_diff(prec,next);}
}
}
inline int cautare(int &value)
{
return S.find(value)!=S.end();
}
inline int stergere(int &value)
{
set<int>::iterator t,next,prec;
t=S.find(value);
if(t==S.end())
return -1;
prec=next=t;
prec--;
next++;
if(t==S.begin())
{if(next!=S.end())
erase_diff(t,next);}
else
if(next==S.end())
erase_diff(t,prec);
else
{erase_diff(t,next);
erase_diff(t,prec);
insert_diff(prec,next);}
S.erase(value);
return 0;
}
inline int maxdiff()
{
set<int>::iterator i;
set<int>::reverse_iterator j;
if(diff.empty())
return -1;
i=S.begin();
j=S.rbegin();
return (*j)-(*i);
}
inline int mindiff()
{
set<unsigned long long>::iterator k;
if(diff.empty())
return -1;
k=diff.begin();
return (*k)>>30;
}
int main()
{
char cuv[13];
int val,poz;
fin=fopen(infile,"r");
fout=fopen(outfile,"w");
while(fgets(cuv,13,fin))
{switch(cuv[0])
{
case 'I': val=0;
poz=2;
while(cuv[poz]>='0')
{val=val*10+(cuv[poz]-'0');
poz++;}
inserare(val);
break;
case 'S': val=0;
poz=2;
while(cuv[poz]>='0')
{val=val*10+(cuv[poz]-'0');
poz++;}
if(stergere(val)==-1)
fprintf(fout,"-1\n");
break;
case 'C': val=0;
poz=2;
while(cuv[poz]>='0')
{val=val*10+(cuv[poz]-'0');
poz++;}
fprintf(fout,"%d\n",cautare(val));
break;
case 'M': if(cuv[1]=='A')
fprintf(fout,"%d\n",maxdiff());
else
fprintf(fout,"%d\n",mindiff());
break;
}}
fclose(fin);
fclose(fout);
return 0;
}