Cod sursa(job #785420)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 8 septembrie 2012 23:48:36
Problema Zeap Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <set>

using namespace std;

ifstream f("zeap.in");
ofstream g("zeap.out");

set<int> M;
multiset<int> D;
string S;

set<int>::iterator l,m,r;

void Insert (int X)
{
    if (M.find(X)!=M.end())
        return;

    if (M.empty())
    {
        M.insert(X);
        return;
    }

    M.insert(X);

    r=l=m=M.find(X);
    ++r;

    if (m==M.begin())
    {
        D.insert(*r-*m);
        return;
    }

    --l;

    if (r==M.end())
    {
        D.insert(*m-*l);
        return;
    }

    D.erase(*r-*l);
    D.insert(*r-*m);
    D.insert(*m-*l);
}

int Delete (int X)
{
    l=r=m=M.find(X);

    if (m==M.end()) return -1;

    r++;

    if (m==M.begin() && r==M.end())
    {
        M.erase(m);
        return 0;
    }

    if (m==M.begin())
    {
        D.erase(*r-*m);
        return 0;
    }

    l--;

    if (r==M.end())
    {
        D.erase(*m-*l);
        return 0;
    }

    D.erase(*r-*m);
    D.erase(*m-*l);
    D.insert(*r-*l);

    M.erase(m);

    return 0;
}

bool Search (int X)
{
    m=M.find(X);

    return !(m==M.end());
}

int MaxDif ()
{
    if (M.size()<2) return -1;
    int a=*M.rbegin();
    int b=*M.begin();

    return a-b;
}

int MinDif ()
{
    if (D.empty()) return -1;
    return *D.begin();
}

unsigned int i;

int GetInt ()
{
    int N=0;
    for (i=2; i<S.size(); i++)
        N=N*10+S[i]-'0';
    return N;
}

int main ()
{
    int N;
    while (getline(f,S))
    {
        if (S=="MAX")
        {
            g << MaxDif() << '\n';
            continue;
        }
        if (S=="MIN")
        {
            g << MinDif() << '\n';
            continue;
        }

        if (S[0]=='I')
        {
            N=GetInt();
            Insert(N);
            continue;
        }

        if (S[0]=='S')
        {
            N=GetInt();
            if (Delete(N)==-1)
                g << -1 << '\n';
            continue;
        }

        if (S[0]=='C')
        {
            N=GetInt();
            g << Search(N) << '\n';
            continue;
        }
    }

    f.close();
    g.close();
    return 0;
}