Cod sursa(job #167109)

Utilizator VmanDuta Vlad Vman Data 29 martie 2008 00:56:55
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
using namespace std;
#include <stdio.h>
#include <string.h>
#include <set>

char sir[20];

set<int> A;
multiset<int> Dif;

inline int get_val() 
{ 
int i=2,L=strlen(sir),nr=0; 
for (;i<L;++i) nr=nr*10+sir[i]-'0'; 
return nr;
}

void insert(int v)
{
 set<int>::iterator poz,next,prev;
 int de=0;
 A.insert(v);
 poz=A.find(v);
 next=poz; ++next;
 prev=poz; if (*poz>*A.begin()) --prev;
 if (next!=A.end()) { Dif.insert( *next - v );++de; }
 if (*poz>*A.begin()) { Dif.insert( v - *prev );++de; }
 if (de==2) Dif.erase(Dif.find( *next - *prev ) );
}

void sterge(int v)
{
 set<int>::iterator poz,next,prev;
 int de=0;
 poz=A.find(v);
 if (poz==A.end()) { printf("-1\n"); return; }
 next=poz; ++next;
 prev=poz; if (*poz>*A.begin()) --prev;
 if (next!=A.end()) { Dif.erase( Dif.find( *next - v ) );++de; }
 if (*poz>*A.begin()) { Dif.erase( Dif.find( v - *prev ) );++de; }
 if (de==2) Dif.insert( *next - *prev );
//   printf("%d\n",*(++poz)-*(--poz));
 A.erase(poz); 
}

void cauta(int v) { printf("%d\n",A.find(v)!=A.end()); }

void minim()
{
 if (Dif.size()>0) printf("%d\n",*Dif.begin());
        else printf("-1\n");
}

void maxim()
{
 if (A.size()>0) printf("%d\n",*(--A.end())-*A.begin());
        else printf("-1\n");
}

int main()
{
 freopen("zeap.in","r",stdin);
 freopen("zeap.out","w",stdout);
 while (!feof(stdin))
       {
        gets(sir);
        switch (sir[0])
               {
                case 'I': {
                           insert(get_val());
                           break;
                          }
                case 'S': {
                           sterge(get_val());
                           break;
                          }
                case 'C': {
                           cauta(get_val());
                           break;
                          } 
                case 'M': {
                           if (sir[1]=='I') minim();
                              else maxim();
                           break;   
                          }                                     
               }         
       }
 fclose(stdout);      
 return 0;
}