Cod sursa(job #403650)

Utilizator freak93Adrian Budau freak93 Data 25 februarie 2010 10:04:21
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include<fstream>
#include<algorithm>
#include<set>
#include<string>
#include<map>

using namespace std;

const char iname[]="zeap.in";
const char oname[]="zeap.out";

ifstream f(iname);
ofstream g(oname);

map<int,int> M;
set<int> S;
string aux;

int n,i,x,y;

int main()
{
    pair<set<int>::iterator,bool>r;
    while(1)
    {
        f>>aux;
        if(f.fail())
            break;
        if(aux=="I")
        {
            f>>x;
            if((r=S.insert(x)).second==true)
            {
                set<int>::iterator now,past,future;
                now=past=future=r.first;
                --past;
                ++future;
                if(now!=S.begin()&&future!=S.end())
                    if(--M[*future-*past]==0)
                        M.erase(*future-*past);
                if(now!=S.begin())
                    ++M[*now-*past];
                if(future!=S.end())
                    ++M[*future-*now];
            }
            f.get();
            continue;
        }
        if(aux=="S")
        {
            f>>x;
            set<int>::iterator now,past,future;
            if((now=S.find(x))!=S.end())
            {
                past=future=now;
                --past;
                ++future;
                if(now!=S.begin())
                    if(--M[*now-*past]==0)
                        M.erase(*now-*past);
                if(future!=S.end())
                    if(--M[*future-*now]==0)
                        M.erase(*future-*now);
                if(now!=S.begin()&&future!=S.end())
                    ++M[*future-*past];
                S.erase(now);
            }
            else
                g<<"-1\n";
            f.get();
            continue;
        }
        if(aux=="C")
        {
            f>>x;
            if(S.find(x)!=S.end())
                g<<"1\n";
            else
                g<<"0\n";
            f.get();
            continue;
        }
        if(S.size()<2)
        {
            g<<"-1\n";
            f.get();
            continue;
        }
        if(aux=="MAX")
        {
            set<int>::iterator now;
            now=S.end();
            --now;
            g<<*now-*S.begin()<<"\n";
            f.get();
            continue;
        }
        g<<M.begin()->first<<"\n";
        f.get();
    }

    f.close();
    g.close();

    return 0;
}