Cod sursa(job #709204)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 7 martie 2012 20:03:58
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <cstring>
#include <set>

using namespace std;

#define maxn 20

int n, nr, x;
char s[maxn];
set<int> g;
multiset<int> d;

void insereaza(int nr)
{
    if(g.find(nr)!=g.end())
        return;

    g.insert(nr);

    set<int> :: iterator it, nx, pv;

    it=g.find(nr);
    ++it;
    nx=it;
    --it;
    if(nx!=g.end())
        d.insert(*nx-*it);

    if(it!=g.begin())
    {
        --it;
        pv=it;
        ++it;
        d.insert(*it-*pv);
        if(nx!=g.end())
            d.erase(d.find(*nx-*pv));
    }
}

void sterge(int nr)
{
    if(g.find(nr)==g.end())
    {
        printf("-1\n");
        return;
    }

    set<int> :: iterator it, nx, pv;

    it=g.find(nr);
    ++it;
    nx=it;
    --it;
    if(nx!=g.end())
        d.erase(d.find(*nx-*it));

    if(it!=g.begin())
    {
        --it;
        pv=it;
        ++it;
        d.erase(d.find(*it-*pv));
        if(nx!=g.end())
            d.insert(*nx-*pv);
    }

    g.erase(nr);
}

int main()
{
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);

    while(gets(s))
    {
        if(s[1]=='A')
        {
            if(g.size()<2)
                printf("-1\n");
            else
                printf("%d\n", (*g.rbegin())-(*g.begin()));
            continue;
        }
        if(s[1]=='I')
        {
            if(g.size()<2)
                printf("-1\n");
            else
                printf("%d\n", (*d.begin()));
            continue;
        }

        n=strlen(s);
        nr=0;
        for(int i=2; i<n; ++i)
            nr=nr*10+s[i]-'0';

        if(s[0]=='I')
            insereaza(nr);
        if(s[0]=='S')
            sterge(nr);
        if(s[0]=='C')
        {
            x=0;
            if(g.find(nr)!=g.end())
                x=1;
            printf("%d\n", x);
        }
    }

    return 0;
}