Cod sursa(job #613576)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 30 septembrie 2011 19:28:09
Problema Secv8 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <cstring>
#include <set>

using namespace std;

multiset <int> v;
set <int> s;
set <int>::iterator it,it1,it2;
inline int abs(int v){if (v>0) return v;else return -v;}

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

int d_zeap(int x)
{
    it=s.find(x);
    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 - x));
    if (it1 != it)
        v.erase(v.find(x-*it1));
    if (it2!=s.end()&&it1!=it)
        v.insert(*it2-*it1);
    s.erase(it);
    it=s.find(x);
    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 - x));
    if (it1 != it)
        v.erase(v.find(x-*it1));
    if (it2!=s.end()&&it1!=it)
        v.insert(*it2-*it1);
    s.erase(it);
    return 0;
}

int s_zeap(int x)
{
    return s.find(x)!=s.end();
}

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

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

int main()
{
    char ch[20];
    int i,x,aux;
    freopen("secv8.in","r",stdin);
    freopen("secv8.out","w",stdout);
    while (!feof(stdin))
    {
        fgets(ch,sizeof(ch),stdin);
        aux=strlen(ch);
        for(i=2,x=0;i<aux-1;++i)
            x=x*10+(ch[i]-48);
        if (ch[0]=='I')
            i_zeap(x);
        else if (ch[0]=='S')
        {
            if (d_zeap(x)==-1)
                printf("-1\n");
        }
        else if (ch[0]=='C')
            printf("%d\n", s_zeap(x));
        else if (ch[1]=='A')
            printf("%d\n",max_zeap());
        else
            printf("%d\n",min_zeap());
    }
    return 0;
}