Cod sursa(job #129749)

Utilizator stef2nStefan Istrate stef2n Data 30 ianuarie 2008 01:43:18
Problema Zeap Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 kb
#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;
}