Cod sursa(job #1457148)

Utilizator retrogradLucian Bicsi retrograd Data 2 iulie 2015 19:49:00
Problema Zeap Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<bits/stdc++.h>

using namespace std;
typedef int var;

char line[40];

set<var> Set;
multiset<var> Diffs;
#define INF 2e9

var getint() {
    getchar();
    var a = 0;
    char c;
    while(isdigit(c = getchar())) {
        a = a * 10 + c - '0';
    }
    return a;
}

void Insert(var val) {
    auto p = Set.insert(val);

    if(p.second == 0) return;

    auto it = p.first;
    auto succ = it, pred = it;
    succ++, pred--;

    if(*succ != INF && *pred != -INF)
        Diffs.erase(*succ - *pred);

    if(*succ !=  INF) Diffs.insert(*succ - *it);
    if(*pred != -INF) Diffs.insert(*it - *pred);
}

void Erase(var val) {
    auto it = Set.find(val);
    if(it == Set.end()) {cout << "-1\n"; return;}

    auto succ = it, pred = it;
    succ++, pred--;

    if(*succ != INF && *pred != -INF)
        Diffs.insert(*succ - *pred);

    if(*succ !=  INF) Diffs.erase(*succ - *it);
    if(*pred != -INF) Diffs.erase(*it - *pred);
}

var Find(var val) {
    return (Set.find(val) != Set.end());
}

var getMax() {
    if(Diffs.empty()) return -1;

    auto it2 = Set.end();
    it2--;it2--;
    auto it1 = Set.begin();
    it1++;

    return (*(it2) - *(it1));
}

var getMin() {
    if(Diffs.empty()) return -1;
    return *Diffs.begin();
}

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

    Set.insert(INF);
    Set.insert(-INF);

    char c;
    while((c = getchar()) != -1) {
        switch(c) {
        case 'M':
            if(getchar() == 'A')    printf("%d\n", getMax());
            else                    printf("%d\n", getMin());

            getchar(); getchar();
            break;
        case 'I':
            Insert(getint());
            break;
        case 'S':
            Erase(getint());
            break;
        case 'C':
            printf("%d\n", Find(getint()));
        }
    }

    return 0;
}