Cod sursa(job #1552822)

Utilizator akaprosAna Kapros akapros Data 18 decembrie 2015 18:45:42
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
#define inf 2000000006
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());
        if (s[0] == 'S')
            if (merase(val()))
                printf("-1\n");
        if (s[0] == 'C')
            printf ("%d\n", m.find(val()) != m.end());
        if (s[0] == 'M')
        {
            if (s[1] == 'I')
                printf("%d\n", mmin());
            else
                printf("%d\n", mmax());
        }
    }
}
int main()
{
    rsw();
    return 0;
}