Cod sursa(job #39512)

Utilizator cos_minBondane Cosmin cos_min Data 26 martie 2007 19:43:08
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 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;

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("%d",&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)
{
    s.insert(i);
}

void Remove(long long i)
{
    if ( i == poz1 || i == poz2 ) poz1 = poz2 = -1;
    it = s.find(i);
    if ( *it == 0 || *it >= s.size() ) 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()
{
    if ( s.size() >= 2 ) 
    {
        maxim = *s.begin();
        it = s.end();
        it--;
        maxim = abs(*it-maxim);
        printf("%lld\n",maxim);  
    }      
    else                 printf("-1\n");
}   

void Minim()
{
   if ( s.size() >= 2 )
   {
        if ( poz1 > 0 && poz2 > 0 ) printf("%d\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("%d\n",minim);
       }    
    }
    else       printf("-1\n");     
}