Pagini recente » Cod sursa (job #1763029) | Cod sursa (job #1010395) | Cod sursa (job #1881237) | Cod sursa (job #1310405) | Cod sursa (job #1740846)
#include <iostream>
#include <fstream>
#include <map>
#include <set>
#include <cmath>
using namespace std;
ifstream in("zeap.in");
ofstream out("zeap.out");
map<int, int> mp;
set<pair<int, int>> S;
int id = 0;
void rem(int x) {
if(S.size() == 1) {
S.erase(S.begin());
return;
}
if(S.size() == 2) {
S.erase(S.lower_bound({x, 0}));
mp[abs(S.begin()->first-x)]--;
return;
}
S.erase(S.lower_bound({x, 0}));
set<pair<int, int>>::iterator it = S.lower_bound({x, 0});
set<pair<int, int>>::iterator en = it;
advance(en, -1);
if(it == S.end()) {
mp[x-en->first]--;
} else if(it == S.begin()) {
mp[it->first-x]--;
} else {
//cout << "Test " << it->first << " " << en->first << '\n';
mp[it->first-en->first]++;
mp[x-en->first]--;
mp[it->first-x]--;
}
}
void ins(int x) {
if(S.size() == 0) {
S.insert({x, id++});
return;
}
if(S.size() == 1) {
mp[abs(S.begin()->first-x)]++;
S.insert({x, id++});
return;
}
set<pair<int, int>>::iterator it = S.lower_bound({x, 0});
set<pair<int, int>>::iterator en = it;
advance(en, -1);
if(it == S.end()) {
mp[x-en->first]++;
//cout << "T1 " << x << " " << en->first << '\n';
} else if(it == S.begin()) {
mp[it->first-x]++;
//cout << "T2 " << x << " " << it->first << '\n';
} else {
mp[it->first-en->first]--;
mp[x-en->first]++;
mp[it->first-x]++;
//cout << "T3 " << x << " " << it->first << " " << en->first << '\n';
}
S.insert({x, id++});
}
int main() {
string a;
int x;
while(in >> a) {
if(a == "I") {
in >> x;
ins(x);
}
if(a == "S") {
in >> x;
if(S.lower_bound({x, 0})->first == x) {
rem(x);
} else {
out << "-1" << '\n';
}
}
if(a == "C") {
in >> x;
if(S.lower_bound({x, 0})->first == x) {
out << "1" << '\n';
} else {
out << "0" << '\n';
}
}
if(a == "MAX") {
if(S.size() < 2) {
out << "-1" << '\n';
} else {
set<pair<int, int>>::iterator it = S.end();
advance(it, -1);
out << it->first-S.begin()->first << '\n';
}
}
if(a == "MIN") {
while(mp.begin()->second == 0)
mp.erase(mp.begin());
if(mp.size() == 0) {
out << "-1" << '\n';
} else {
out << mp.begin()->first << '\n';
}
}
}
return 0;
}