Cod sursa(job #2269682)

Utilizator giotoPopescu Ioan gioto Data 26 octombrie 2018 13:31:38
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.59 kb
#include <bits/stdc++.h>
using namespace std;

char s[10];
int k = 0;
set <int> S;
set <pair <int, int> > Min;
inline int maxim(){
    if(S.size() < 2) return -1;
    return *S.rbegin() - *S.begin();
}
inline int minim(){
    if(S.size() < 2) return -1;
    return Min.begin()->first;
}
inline int cauta(int x){
    if(S.find(x) != S.end()) return 1;
    return 0;
}
inline void inserare(int x){
    if(cauta(x)) return ;
    S.insert(x);
    if(S.size() == 1) return ;
    set <int> :: iterator it = S.lower_bound(x);
    if(it != S.begin()){
        set <int> :: iterator it2 = prev(it);
        if(next(it) != S.end()){
            set <int> :: iterator it3 = next(it);
            int val = *it3 - *it2;
            set <pair <int, int> > :: iterator it4 = Min.lower_bound({val, 0});
            if(it4->second == 1) Min.erase(it4);
            else{
                int k = it4->second - 1;
                Min.erase(it4);
                Min.insert({val, k});
            }
        }
        int val = *it - *it2;
        set <pair <int, int> > :: iterator it4 = Min.lower_bound({val, 0});
        if(it4->first != val) Min.insert({val, 1});
        else{
            int k = it4->second + 1;
            Min.erase(it4);
            Min.insert({val, k});
        }
    }
    if(next(it) != S.end()){
        set <int> :: iterator it3 = next(it);
        int val = *it3 - *it;
        set <pair <int, int> > :: iterator it4 = Min.lower_bound({val, 0});
        if(it4->first != val) Min.insert({val, 1});
        else{
            int k = it4->second + 1;
            Min.erase(it4);
            Min.insert({val, k});
        }
    }
}
inline void stergere(int x){
    if(cauta(x)){
        set <int> :: iterator it = S.lower_bound(x);
        if(it != S.begin()){
            set <int> :: iterator it2 = prev(it);
            if(next(it) != S.end()){
                set <int> :: iterator it3 = next(it);
                int val = *it3 - *it2;
                set <pair <int, int> > :: iterator it4 = Min.lower_bound({val, 0});
                if(it4->first != val) Min.insert({val, 1});
                else{
                    int k = it4->second + 1;
                    Min.erase(it4);
                    Min.insert({val, k});
                }
            }
            int val = *it - *it2;
            set <pair <int, int> > :: iterator it4 = Min.lower_bound({val, 0});
            if(it4->second == 1) Min.erase(it4);
            else{
                int k = it4->second - 1;
                Min.erase(it4);
                Min.insert({val, k});
            }
        }
        if(next(it) != S.end()){
            set <int> :: iterator it3 = next(it);
            int val = *it3 - *it;
            set <pair <int, int> > :: iterator it4 = Min.lower_bound({val, 0});
            if(it4->second == 1) Min.erase(it4);
            else{
                int k = it4->second - 1;
                Min.erase(it4);
                Min.insert({val, k});
            }
        }
        S.erase(x);
    }
    else printf("-1\n");
}
int main()
{
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);

    int x;
    while(!feof(stdin)){
        scanf("%s", s);
        if(s[0] == 'M'){
            scanf("\n");
            if(s[1] == 'A') printf("%d\n", maxim());
            else printf("%d\n", minim());
        }
        else{
            scanf("%d\n",&x);
            if(s[0] == 'I') inserare(x);
            if(s[0] == 'S') stergere(x);
            if(s[0] == 'C') printf("%d\n", cauta(x));
        }

    }

    return 0;
}