Cod sursa(job #1194676)

Utilizator denisx304Visan Denis denisx304 Data 4 iunie 2014 16:37:26
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;

char sir[100];
set<int> A;
multiset<int> Dif;

inline int get_val()
{
    int i = 2, L = strlen(sir), nr=0;
    for (; i < L; ++ i)
        nr = nr * 10 + sir[i] - '0';
    return nr;
}

void insert(int v)
{
    set<int>::iterator poz,next,prev;
    int de = 0, sz;
    sz = A.size();
    A.insert(v);
    if (sz == A.size())
        return;
    poz = A.find(v);
    next = poz;
    ++ next;
    prev = poz;
    if (*poz > *A.begin())
        --prev;
    if (next!=A.end())
    {
        Dif.insert(*next - v);
        ++ de;
    }
    if (*poz > *A.begin())
    {
        Dif.insert(v - *prev);
        ++ de;
    }
}

void sterge(int v)
{
    set < int > :: iterator poz, next, prev;
    int de = 0;
    poz = A.find(v);
    if (poz == A.end())
    {
        printf("-1\n");
        return;
    }
    next = poz;
    ++ next;
    prev = poz;
    if (*poz > *A.begin())
    -- prev;
    if (next != A.end())
    {
        Dif.erase(Dif.find(*next - v));
        ++ de;
    }
    if (*poz > *A.begin())
    {
        Dif.erase(Dif.find(v - *prev));
        ++ de;
    }
    if (de == 2)
        Dif.insert(*next - *prev);
    A.erase(poz);
}

void cauta(int v)
{
    printf("%d\n", A.find(v)!=A.end());
}

void minim()
{
    if (Dif.size() > 0)
        printf("%d\n", *Dif.begin());
    else
        printf("-1\n");
}

void maxim()
{
    set < int > :: iterator poz;
    if (A.size() > 1)
    {
        poz = A.end();
        -- poz;
        printf("%d\n", *poz - *A.begin());
    }
    else
        printf("-1\n");
}

int main()
{
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);
    while (gets(sir))
    {
        switch (sir[0])
        {
            case 'I':
            {
                insert(get_val());
                break;
            }
            case 'S':
            {
                sterge(get_val());
                break;
            }
            case 'C':
            {
                cauta(get_val());
                break;
            }
            case 'M':
            {
                if (sir[1] == 'I')
                    minim();
                else
                    maxim();
                break;
            }
        }
    }
    fclose(stdout);
    return 0;
}