Pagini recente » Cod sursa (job #1505476) | Cod sursa (job #870926) | Cod sursa (job #1873288) | Cod sursa (job #1760763) | Cod sursa (job #1457170)
#include<bits/stdc++.h>
using namespace std;
typedef int var;
set<var> Set, Diffs;
unordered_map<var, var> Count;
#define INF 1200000000
set<var>::iterator first, last;
void increment(var val) {
if(Count[val] == 0) Diffs.insert(val);
Count[val]++;
}
void decrement(var val) {
Count[val] --;
if(Count[val] == 0) Diffs.erase(val);
}
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)
decrement(*succ - *pred);
if(succ != last) increment(*succ - *it);
if(pred != first) increment(*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)
increment(*succ - *pred);
if(succ != last) decrement(*succ - *it);
if(pred != first) decrement(*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 = last; it2--;
auto it1 = first; 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;
}