Cod sursa(job #1253419)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 1 noiembrie 2014 11:54:10
Problema Zeap Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <fstream>
#include <cstring>
#include <iostream>
#include <set>

#define sint set<int>::iterator

using namespace std;


ifstream fin("zeap.in");
ofstream fout ("zeap.out");

char s[1<<22];
int p,n,x,y,op,z;

int get_op ()
{
    p+=2;
    if (s[p-1] == 'I')
       return 1;
    if (s[p-1] == 'S')
       return 2;
    if (s[p-1] == 'C')
       return 3;
    p +=2;
    if (s[p-2] == 'A')
       return 4;
    if (s[p-2] == 'I')
       return 5;
    return 6;
}

int get_int()
{
    ++p;

    int x = 0;

    while (p < n && s[p] != ' ' && s[p] != '\n')
    {
        x = x*10+(s[p]-'0');
        ++p;
    }
    return x;
}

int main()
{
    FILE *file = fopen ("zeap.in","r");
    fread (s,1,(1<<22),file);
    n = strlen(s);

    set <int> S;
    multiset <int> dif;
    p = -1;

    while (p < n)
    {
        op = get_op ();
        if (op == 6)
         break;

        if (op == 1)
        {
            x = get_int ();

            if (S.find(x) != S.end())
              continue;

            sint it1 = S.lower_bound (x);
            if (it1 == S.begin())
            {
               it1 = S.end();
            }
            else
            {
                --it1;
                dif.insert (x-*it1);
            }
            sint it2 = S.upper_bound (x);
            if (it2 != S.end())
            {
                dif.insert (*it2-x);
            }
            if (it1 != S.end() && it2 != S.end())
               dif.erase (*it2-*it1);
            S.insert (x);
        }
        else if (op == 2)
        {
            x = get_int ();

            if (S.find (x) == S.end())
                fout<<-1<<"\n";
            else
            {
                sint it1 = S.lower_bound (x);
                if (it1 == S.begin())
                {
                      it1 = S.end();
                }
                else
                {
                      --it1;
                      dif.erase (x-*it1);
                }
                sint it2 = S.upper_bound (x);
                if (it2 != S.end())
                    {
                        dif.erase (*it2-x);
                    }
                if (it1 != S.end() && it2 != S.end())
                  dif.insert (*it2-*it1);
                S.erase (x);
            }
        }
        else if (op == 3)
        {
            x = get_int();

            sint it = S.find (x);

            if (it != S.end())
              fout<<1;
            else fout<<0;
            fout<<"\n";
        }
        else if (op == 4)
        {
            if (S.size() < 2)
            {
                fout<<-1<<"\n";
            }
            else
            {
                sint it = S.end();
                --it;
                fout<<*it-*S.begin()<<"\n";
            }
        }
        else
        {
            if (S.size() < 2)
            {
                fout<<-1<<"\n";
            }
            else fout<<*dif.begin()<<"\n";
        }
    }
}