Cod sursa(job #1508619)

Utilizator BLz0rDospra Cristian BLz0r Data 22 octombrie 2015 19:30:42
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.29 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
using namespace std;

FILE *f = fopen ( "zeap.in", "r" );
FILE *g = fopen ( "zeap.out", "w" );

set < int > Set; // sirul sortat ( insert + delete + search )
map < int, int > Map; // tin aparitia fiecare diferente de valori
priority_queue < int > Heap; // tin valorile minime pentru ultima cerinta
char s[20], *p;

int ReadInt (){

    while ( *p < '0' || *p > '9' )
        p++;

    int nr = 0;

    while ( *p >= '0' && *p <= '9' ){
        nr = nr * 10 + ( *p - '0' );
        p++;
    }

    return nr;
}

int main(){

    int x, val;
    set < int > :: iterator it, it1, it2;

    while ( fgets(s, 20, f) != NULL ){
        p = s;

        if ( s[0] == 'I' ){ // Insert

            x = ReadInt();

            if ( Set.find(x) != Set.end() ) //daca deja exista elementul, trec peste
                continue;

            it = Set.insert( Set.begin(), x ); // vad unde il insereaza

            it1 = it; it1--; // iau elementul din stanga curentului
            it2 = it; it2++; // iau elementul din dreapta curentului

            //daca elementul nu e nici primul nici ultimul
            if ( it != Set.begin() && it2 != Set.end() ){
                val = abs( *it2 - *it1 );
                Map[val]--; // am stricat diferenta dintre numerele intre care l-am inserat
            }

            //daca NU e primul
            if ( it != Set.begin() ){
                val = abs( *it - *it1 );
                Map[val]++; //adaug diferenta facuta cu stanga in Heap
                if ( Map[val] == 1 )
                    Heap.push(-val);
            }

            //daca NU e ultimul
            if ( it2 != Set.end() ){
                val = abs( *it2 - *it );
                Map[val]++; //adaug diferenta facuta cu dreapta in Heap
                if ( Map[val] == 1 )
                    Heap.push(-val);
            }

            continue;
        }

        if ( s[0] == 'S' ){ // Delete

            x = ReadInt();
            it = Set.find(x);

            if ( it != Set.end() ){ //daca exista elementul

                it1 = it; it1--; // iau elementul din stanga curentului
                it2 = it; it2++; // iau elementul din dreapta curentului

                //daca elementul nu e nici primul nici ultimul
                if ( it != Set.begin() && it2 != Set.end() ){
                    val = abs( *it2 - *it1 );
                    Map[val]++; // adaug diferenta dintre numerele dintre care l-am sters
                    if ( Map[val] == 1 )
                        Heap.push(-val);
                }

                //daca NU e primul
                if ( it != Set.begin() ){
                    val = abs( *it - *it1 );
                    Map[val]--; // scot valoarea pe care o facea cu stanga
                }

                //daca NU e ultimul
                if ( it2 != Set.end() ){
                    val = abs( *it2 - *it );
                    Map[val]--; //scot valoarea pe care o facea cu dreapta
                }

                //sterg efectiv
                Set.erase(it);
            }
            else
                fprintf ( g, "-1\n" );

            continue;
        }

        if ( s[0] == 'C' ){ //cautare

            x = ReadInt();

            if ( Set.find(x) != Set.end() )
                fprintf ( g, "1\n" );
            else
                fprintf ( g, "0\n" );

            continue;
        }

        if ( s[1] == 'A' ){ //daca vreau maxim, iau capetele

            if ( Set.size() < 2 )
                fprintf ( g, "-1\n" );
            else{
                it = Set.end();
                it--;
                fprintf ( g, "%d\n", abs ( *Set.begin() - *it ) );
            }
            continue;
        }
        if ( s[1] == 'I' ){ //daca vreau minim

            if ( Set.size() < 2 )
                fprintf ( g, "-1\n" );
            else{
                //scot din heap toate elementele care au fost eliminate pe parcurs
                while ( !Heap.empty() && Map[-Heap.top()] <= 0 )
                    Heap.pop();

                fprintf ( g, "%d\n", -Heap.top() );
            }

            continue;
        }
    }

    return 0;
}