Cod sursa(job #1787713)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 24 octombrie 2016 22:16:54
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <set>
#include <string>


using namespace std;

set <int> v;
multiset <int> diff;

void insert_zeap ( int x ){
    std::pair<std::set<int>::iterator,bool> ret;
    ret = v.insert(x);

    if(ret.second == false){
        return;
    }
    set <int>::iterator it1,it2,it3;

    it1 = it2 = it3 = ret.first;
    it1--;
    it3++;

    if( it2 != v.begin() && it3!= v.end() ){
        diff.erase( diff.find( (*it3) - (*it1) ) );
    }
    if( it2 != v.begin() ){
        diff.insert( (*it2) - (*it1) );
    }
    if( it3 != v.end() ){
        diff.insert( (*it3)  - (*it2) );
    }
}

int delete_zeap ( int x ){
    std::set<int>::iterator ret;

    ret = v.find(x);

    if(ret == v.end() ){
        return -1;
    }

    set< int >::iterator it1, it2, it3;
    it1 = it2 = it3 = ret;
    --it1; ++it3;

    if(it2 != v.begin() && it3 != v.end()){
        diff.insert( (*it3) - (*it1) );
    }
    if(it2 != v.begin()){
        diff.erase(diff.find( (*it2) - (*it1) ) );
    }
    if(it3 != v.end()){
        diff.erase(diff.find( (*it3) - (*it2) ) );
    }

    v.erase(ret);
    return 0;
}

int getval( string &s ){
    int nr=0;

    int pos = s.find(' ') + 1 ;

    for(; pos < s.length() ; pos++){
        nr = nr * 10 + s[pos] - '0' ;
    }
    return nr;
}

int cauta_zeap( int x ){
    return v.find( x ) != v.end();

}

int max_dif(){
    if( v.size()<2 ){
        return -1;
    }
    return *v.rbegin() - *v.begin();
}

int min_dif(){
    if( v.size()<2 ){
        return -1;
    }
    return *diff.begin();
}

int main(){
    string sir;
    int val, sol ;


    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);

    while ( getline(cin, sir ) ){
        if( sir[0] == 'I' ){
            val = getval(sir);
            insert_zeap( val );
        }else if ( sir[0] == 'S' ){
            val = getval(sir);
            sol = delete_zeap ( val );
            if(sol == -1 ){
                printf("-1\n");
            }
        }else if ( sir[0] == 'C' ){
            val = getval(sir);
            printf("%d\n", cauta_zeap ( val )  );
        }else{
            if(sir[1] == 'A' ){
                printf("%d\n", max_dif() );
            }else{
                printf("%d\n", min_dif() );
            }
        }
    }

    return 0;
}