Cod sursa(job #1228712)

Utilizator lucian666Vasilut Lucian lucian666 Data 15 septembrie 2014 00:44:04
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb



#include <fstream>
#include <set>

#define DIM 6
using namespace std;
ofstream out("zeap.out");

char op[DIM];
int number;

multiset < int > Z , dif;
typedef multiset < int >:: iterator IT;

int main()
{

    ifstream in("zeap.in");

    while( in >> op )
    {

        if( op[0] == 'I' )
        {
            //Insert operation
            in >> number;
            if( Z.find(number) == Z.end())
            {

                Z.insert(number);

                IT poz = Z.find(number);

                IT poz2 , poz3;

                if( poz != Z.begin() )
                {

                    poz2 = poz;
                    poz3 = poz;

                    --poz2;
                    ++poz3;

                    dif.insert( number - *poz2 );
                    if( poz3 != Z.end() )
                    {
                        //better diference
                        dif.erase(dif.find(*poz3 - *poz2));
                        dif.insert( *poz3 - number );
                    }

                }
                else
                {

                    poz3 = poz;
                    ++poz3;
                    if( poz3 != Z.end() )
                        dif.insert(*poz3 - number );

                }



            }
            continue;



        }

        if( op[0] == 'S' )
        {

            //delete + updata the dif
            in >> number;

            IT poz , poz2 , poz3;

            if( ( poz = Z.find(number ) ) != Z.end() )
            {


            poz2 = poz;
            poz3 = poz;

            if( poz != Z.begin() )
            {

                --poz2;
                dif.erase(dif.find( number - *poz2 ));

            }

            ++poz3;

            if( poz3 != Z.end() )
                dif.erase(dif.find(*poz3 - number));

            if( poz!= Z.begin() && poz!= Z.end() )
                dif.insert(*poz3 - *poz2 );

            Z.erase(number);
            continue;
            }

            out << -1 << '\n';
            continue;


        }

        if( op[0] == 'C' )
        {

            in >> number ;

            out << ( Z.find(number) != Z.end() ) << '\n';
            continue;
        }

        if( op[1] == 'A')
        {

            //maxim
            if( Z.size() < 2  )
            {
                out << -1 << '\n';
                continue;
            }

            IT sf = Z.end();
            --sf;

            out << *sf - *Z.begin() << '\n';

            continue;
        }

        if( op[1] == 'I' )
        {

            //minim;
            if( dif.size())
                out << *dif.begin() << '\n';
            else
                out << -1 << '\n';

            continue;

        }


    }


    return 0;

}