Cod sursa(job #596074)

Utilizator SpiderManSimoiu Robert SpiderMan Data 15 iunie 2011 18:36:42
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
# include <cstdio>
# include <cstring>
# include <set>
using namespace std;

const char *FIN = "zeap.in", *FOU = "zeap.out";

set <int> S;
multiset <int> MS;
char sir[20];

inline int cit (void) {
    int x = 0;
    for (char *p = sir + 2; *p >= '0' && *p <= '9'; ++p)
        x = x * 10 + *p - '0';
    return x;
}

inline bool check (const char *X) {
    for (int i = 0, j = strlen (X); i < j; ++i) {
        if (sir[i] != X[i]) {
            return 0 ;
        }
    }
    return 1 ;
}

inline int min (int a, int b) {
    return (a < b ? a : b);
}

inline void insert (int val) {
    if (S.count (val) > 0) return ;
    if (S.empty ()) {
        S.insert (val);
        return ;
    }
    set <int> :: iterator it, it2;
    if ((it = S.upper_bound (val)) != S.begin ()) {
        it2 = it, --it2;
        if (*it > val) {
            multiset <int> :: iterator ms = MS.find (*it - *it2);
            if (ms != MS.end ())
                MS.erase (ms);
            MS.insert (min (*it - val, val - *it2));
        } else MS.insert (val - *it2);
    } else if (*it > val)
        MS.insert (*it - val);
    S.insert (val);
}

inline void sterge (int val) {
    if (S.count (val) == 0) {
        printf ("-1\n");
        return ;
    }
    set <int> :: iterator it, it2, it3;
    if ((it = S.lower_bound (val)) != S.begin ()) {
        it3 = it, --it3;
        multiset <int> :: iterator ms = MS.find (val - *it3);
        if (ms != MS.end ())
            MS.erase (ms);
        if ((it2 = S.upper_bound (val)) != S.end ()) {
            ms = MS.find (*it2 - val);
            if (ms != MS.end ())
                MS.erase (ms);
            MS.insert (*it2 - *it3);
        }
    }
    S.erase (it);
}

inline void cauta (int val) {
    printf ("%d\n", S.count (val) > 0);
}

inline void mindif (void) {
    if (S.size () < 2) {
        printf ("-1\n");
        return ;
    }
    printf ("%d\n", *MS.begin ());
}

inline void maxdif (void) {
    if (S.size () < 2) {
        printf ("-1\n");
        return ;
    }
    set <int> :: iterator it = S.end ();
    printf ("%d\n", *--it - *S.begin ());
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    for ( ; fgets (sir, 20, stdin); ) {
        if (check ("I")) {
            insert (cit ());
        } else if (check ("S")) {
            sterge (cit ());
        } else if (check ("C")) {
            cauta (cit ());
        } else if (check ("MIN")) {
            mindif ();
        } else if (check ("MAX")) {
            maxdif ();
        }
    }
}