Cod sursa(job #1552796)

Utilizator akaprosAna Kapros akapros Data 18 decembrie 2015 17:52:31
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
#define inf 2000000002
using namespace std;
map <int, int> dif;
set <int> m;
char s[20];
int n;
void minsert(int y)
{
    int x, z;
    set <int> :: iterator it1, it2;
    it1 = m.lower_bound (y);
    it2 = it1;
    -- it2;
    x = *it2;
    z = *it1;
    if (z - x >= 0)
        -- dif[z - x];
    if (y - x >= 0)
        ++ dif[y - x];
    if (z - y >= 0)
        ++ dif[z - y];
    m.insert(y);
}
int merase(int y)
{
    int x, z;
    if (m.find(y) == m.end())
        return 1;

    set <int> :: iterator it1, it2;

    it1 = m.upper_bound (y);
    it2 = m.lower_bound (y);
    -- it2;
    m.erase(y);
    x = *it2;
    z = *it1;
    if (z - x >= 0)
        ++ dif[z - x];
    if (y - x >= 0)
        -- dif[y - x];
    if (z - y >= 0)
        -- dif[z - y];
    return 0;
}
int val()
{
    int i, n = strlen(s), v = 0;
    for (i = 2; i < n && s[i] >= '0' && s[i] <= '9'; ++ i)
        v = v * 10 + (s[i] - '0');
    return v;
}
int mmin()
{
    if (m.size() >= 4)
        return dif.begin() -> first;
    return -1;
}
int mmax()
{
    set <int> :: iterator it1, it2;
    if (m.size() >= 4)
    {
        it1 = m.begin();
        ++ it1;
        it2 = m.end();
        -- it2;
        -- it2;
        return *it2 - *it1;
    }
    return -1;
}
void rsw()
{
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);
    m.insert(inf);
    m.insert(-inf / 2);
    while (gets(s))
    {
        if (s[0] == 'I')
            minsert(val());
        else if (s[0] == 'S')
        {
            if (merase(val()))
                printf("-1\n");
        }
        else if (s[0] == 'C')
            printf ("%d\n", m.find(val()) != m.end());
        else
        {
            if (s[1] == 'I')
                printf("%d\n", mmin());
            else
                printf("%d\n", mmax());
        }
    }
}
int main()
{
    rsw();
    return 0;
}