Cod sursa(job #1457160)

Utilizator retrogradLucian Bicsi retrograd Data 2 iulie 2015 20:16:35
Problema Zeap Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 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);
}

var Erase(var val) {
    auto it = Set.find(val);
    if(it == Set.end()) return 0;

    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);

    return 1;
}

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() {
    ifstream fin("zeap.in");
    ofstream fout("zeap.out");

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

    char c;

    string str;
    var val;
    while(fin>>str) {

        if(str == "I")   { fin>>val; Insert(val); }
        if(str == "C")   { fin>>val; fout<<Find(val)<<'\n'; }
        if(str == "S")   { fin>>val; if(!Erase(val)) fout<<"-1\n"; }
        if(str == "MIN") { fout<<getMin()<<'\n'; }
        if(str == "MAX") { fout<<getMax()<<'\n'; }

    }

    return 0;
}