Cod sursa(job #1457157)

Utilizator retrogradLucian Bicsi retrograd Data 2 iulie 2015 20:06:00
Problema Zeap Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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;
    for(c = getchar(); !isdigit(c); c = getchar());
    for(; isdigit(c); 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()) {printf("-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;
    for(char c = getchar(); c != -1; c = getchar()) {
        switch(c) {
        case 'M':
            if(getchar() == 'A')    printf("%d\n", getMax());
            else                    printf("%d\n", getMin());
            break;
        case 'I':
            Insert(getint());
            break;
        case 'S':
            Erase(getint());
            break;
        case 'C':
            printf("%d\n", Find(getint()));
        }
    }

    return 0;
}