Cod sursa(job #70743)

Utilizator cos_minBondane Cosmin cos_min Data 7 iulie 2007 00:10:15
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <stdio.h>
#include <fstream>
#include <set>
using namespace std;

#define in "zeap.in"
#define out "zeap.out"

char linie[21];
set<int> p;
set<int>::iterator it, it2;
int minim = 1000000001, g1, g2; 
int k = 1;

void Erase(int);
void Search(int);
void Insert(int);
void Minim();
void Maxim();

int main()
{
    int j, aux, ok = 1;
    FILE *fin = fopen(in,"r");
    freopen(out,"w",stdout);
    
    while ( fgets(linie,20,fin) ) 
    {
         if ( linie[0] == 'M' )
         {
              if ( linie[1] == 'A' ) Maxim();
              else                   Minim();
         }
         else
         {
             j = 2;
             aux=0;
             while ( linie[j] >= '0' && linie[j] <= '9' ) aux *= 10, aux += (int)linie[j]-48, j++;
             
             if ( linie[0] == 'I' ) Insert(aux);
             if ( linie[0] == 'S' ) Erase(aux);
             if ( linie[0] == 'C' ) Search(aux); 
         }
    }
}

void Insert(int aux)
{
     p.insert(aux);
     
     if ( p.size() >= 2 )
     {
          it = p.find(aux);
          it2 = it;
          
          if ( it != p.begin() ) it2--;
          
          if ( it != p.begin() && aux != *it2 && abs(aux - *(it2) ) < minim ) minim = abs(aux - *(it2) ), g1 = aux, g2 = *it2, k = 0;  
          
          if ( it != p.begin() ) it2++;
          
          if ( it2 != p.end() )
          {
             it2++;
             if ( it2 != p.end() )
             {
                  if ( it2 != p.begin() && aux != *it2 && abs(aux - *(it2) ) < minim ) minim = abs(aux - *(it2) ), g1 = aux, g2 = *it2, k = 0;  
             }
          }
     } 
}

void Search(int aux)
{
     if ( p.size() == 0 ) printf("0\n");
     else
     {
         it = p.find(aux);
         if ( it == p.end() ) printf("0\n"); 
         else                 printf("1\n");
     }
 
}

void Erase(int aux)
{
     if ( aux == g1 || aux == g2 ) k = 1, minim = 1000000001;
     
     if ( p.size() == 0 ) printf("-1\n");
     else
     {
         it = p.find(aux);
         if ( it == p.end() ) printf("-1\n"); 
         else                 p.erase( aux );
     }
}

void Maxim()
{
     if ( p.size() <= 1 ) printf("-1\n");
     else
     {
         int val = 0;
         it = p.begin();
         val = *it;
         it = p.end(); 
         it--;
         
         val = *it-val;
         printf("%d\n",val);
     }  
}

void Minim()
{
     
     if ( p.size() <= 1 ) printf("-1\n");
     else
     {
         if ( k == 0 ) 
         {
              printf("%d\n", minim );
         }
         else
         {
             minim = 1000000001;
             it2 = p.begin();
             it2++;
             for ( it = p.begin(); it2 != p.end(); it++, it2++ )
             {
                 if ( *it2-*it == 1 ) 
                 {
                    g1 = *it2, g2 = *it;
                    k = 0;
                    minim = 1;
                    break;
                 }
                 else if ( *it2-*it < minim ) minim = *it2-*it, g1 = *it2, g2 = *it, k = 0;
         
             }
             printf("%d\n", minim);
         }
         
     }
}