Cod sursa(job #785424)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 9 septembrie 2012 00:02:00
Problema Zeap Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <set>
#include <map>

using namespace std;

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

set<int> M;
map<int, 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[*r-*m];
        return;
    }

    --l;

    if (r==M.end())
    {
        ++D[*m-*l];
        return;
    }
    --D[*r-*l];
    ++D[*r-*m];
    ++D[*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[*r-*m];
        return 0;
    }

    l--;

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

    --D[*r-*m];
    --D[*m-*l];
    ++D[*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()).first;
}

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;
}