Cod sursa(job #39509)

Utilizator cos_minBondane Cosmin cos_min Data 26 martie 2007 19:42:15
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
// 70 pcte
#include <fstream>
#include <iomanip>
#include <set>
#include <iterator>
#include <vector>
#include <stdio.h>
using namespace std;

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

set<long long> s;
set<long long>::iterator it;
set<long long>::iterator it2;

void Add(long long);
void Remove(long long);
void Find(long long);
void Maxim();
void Minim();

long long p=1, n, n2, poz;
long long minim, maxim, h, g, t1, t2, ok;
long long poz1=-1, poz2=-1;

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    char c, d, e;
    long long k;
    while ( scanf("%c",&c) != EOF )
    {
        if ( c != 'M' ) 
        {
            scanf("%lld",&k);
            if ( c == 'I' ) Add(k);
            if ( c == 'S' ) Remove(k);
            if ( c == 'C' ) Find(k);
        }
        else
        {
            if ( c == 'M' )
            {
                scanf("%c%c",&d, &e);
                if ( d == 'A' ) Maxim();
                else            Minim();
            }
        }
    }                          
}  

void Add(long long i)
{
    it = s.lower_bound(i);
    s.insert(i);
    it--;
    if ( s.size() >= 1 )
    {
        if ( poz1 > 0 && poz2 > 0 )
        {
            if ( minim > *it-i )
            {
                minim = *it-i;
                poz1 = *it;
                it2 = s.find(i);
                poz2 = *it2;
            }
        }
        ++it;
        ++it;
        if ( poz1 > 0 && poz2 > 0 )
        {
            if ( minim > *it-i )
            {
                minim = *it-i;
                poz1 = *it;
                it2 = s.find(i);
                poz2 = *it2;
            }
        }
    }    
                
}

void Remove(long long i)
{
    if ( s.size() == 0 ) printf("-1\n");
    else 
    {
         if ( i == poz1 || i == poz2 ) poz1 = poz2 = -1;
         it = s.find(i);
         if ( *it == 0 ) printf("-1\n");
         else    s.erase(s.find(i));
    }
}

void Find(long long i)
{
    it = s.find(i);
    if ( *it == 0 ) printf("0\n");
    else            printf("1\n");
}  

void Maxim()
{
    set<long long>::iterator it;
    maxim = *s.begin();
    it = s.end();
    it--;
    maxim = abs(*it-maxim);
    if ( s.size() >= 2 ) printf("%lld\n",maxim);    
    else                 printf("-1\n");
}   

void Minim()
{
   if ( s.size() >= 2 )
   {
        if ( poz1 > 0 && poz2 > 0 ) printf("%lld\n",minim);
        else
        {
        minim = 10000000;
        it = s.begin();
        n = *it;
        it++;
        n2 = *it;
        if ( minim > abs(n-n2) ) minim = abs(n-n2);
        ok = 1;
        while ( it != s.end() && ok == 1 )
        { 
                 if ( abs(*it-n) < minim && *it != n ) 
                 {
                     minim = abs(*it-n);
                     if ( minim == 1 ) 
                     {
                          ok=0; 
                          poz1 = *it;
                          poz2 = n;
                      }
                  }        
                 n = *it;
                 it++;  
        }
        printf("%lld\n",minim);
       }    
    }
    else       printf("-1\n");     
}