Cod sursa(job #1457166)

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

using namespace std;
typedef int var;

set<var> Set;
multiset<var> Diffs;
#define INF 1200000000
set<var>::iterator first, last;

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 != last && pred != first)
        Diffs.erase(*succ - *pred);

    if(succ !=  last) Diffs.insert(*succ - *it);
    if(pred != first) 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 != last && pred != first)
        Diffs.insert(*succ - *pred);

    if(succ !=  last) Diffs.erase(*succ - *it);
    if(pred != first) Diffs.erase(*it - *pred);

    Set.erase(it);
    return 1;
}

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

    first = Set.insert(0).first;
    last  = Set.insert(2e9).first;

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