Cod sursa(job #614663)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 7 octombrie 2011 10:17:37
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <set>

using namespace std;

set <int> s;
multiset <int> v;
set <int>::iterator it,it1,it2;

int n,i,j,m,nr;
char c[20];

inline int abs(int x){if (x>0) return x;else return -x;}

void i_zeap(int nr)
{
    int dif1,dif2;
    pair <int, int> p1,p2;
    if (s.size()==0)
    {
        s.insert(nr);
        return;
    }
    it2=s.lower_bound(nr);
    if (*it2==nr)
        return;
    it1=it2;
    if (it1!=s.begin())
        --it1;
    if (it2!=s.end())
    {
        dif2=abs(*it2 - nr);
        v.insert(dif2);
    }
    if (it1!=it2)
    {
        dif1=abs(*it1 - nr);
        v.insert(dif1);
    }
    s.insert(nr);
}

int d_zeap(int nr)
{
    it=s.find(nr);
    if (it==s.end())
        return -1;
    it1=it;
    if (it1!=s.begin())
        --it1;
    it2=it;
    ++it2;
    if (it2!=s.end())
        v.erase(v.find(*it2-nr));
    if (it1!=it)
        v.erase(v.find(nr-*it1));
    if (it2!=s.end()&&it1!=it)
        v.insert(*it2-*it1);
    s.erase(it);
    return 0;
}


int s_zeap(int nr)
{
    if (s.find(nr)==s.end())
        return 0;
    else
        return 1;
}

int max_zeap()
{
    if (s.size()<2)
        return -1;
    it=s.end();
    --it;
    return (*it-(*s.begin()));
}

int min_zeap()
{
    if (s.size()<2)
        return -1;
    return (*v.begin());
}

void r()
{
    int i;
    nr=0;
    for (i=2;c[i]!=0;++i)
        nr=nr*10+(c[i]-48);
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    while (gets(c))
    {
        if (c[0]=='I')
        {
            r();
            i_zeap(nr);
        }
        if (c[0]=='S')
        {
            r();
            if (d_zeap(nr)==-1)
                printf("-1\n");
        }
        if (c[0]=='C')
        {
            r();
            printf("%d\n",s_zeap(nr));
        }

        if (c[0]=='M')
        {
            if (c[2]=='X')
                printf("%d\n",max_zeap());
            else
                printf("%d\n",min_zeap());
        }
    }
    return 0;
}