Pagini recente » Cod sursa (job #2603799) | Cod sursa (job #1232516) | Cod sursa (job #106622) | Cod sursa (job #2129515) | Cod sursa (job #3135149)
#include <iostream>
#include <fstream>
#include <set>
#include <queue>
#include <cmath>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
struct Zeap {
set<int> nums;
priority_queue<int> max_diff;
priority_queue<int, vector<int>, greater<int>> min_diff;
void insert(int x) {
if (nums.count(x)) return;
nums.insert(x);
updateDiff();
}
int remove(int x) {
if (!nums.count(x)) return -1;
nums.erase(x);
updateDiff();
return 1;
}
int search(int x) {
return nums.count(x);
}
int maxDiff() {
if (nums.size() < 2) return -1;
int max_difference = *(--nums.end()) - *(nums.begin());
return max_difference;
}
int minDiff() {
if (nums.size() < 2) return -1;
return min_diff.top();
}
void updateDiff() {
if (nums.size() < 2) {
max_diff = priority_queue<int>();
min_diff = priority_queue<int, vector<int>, greater<int>>();
return;
}
max_diff = priority_queue<int>();
min_diff = priority_queue<int, vector<int>, greater<int>>();
auto it1 = nums.begin();
auto it2 = next(it1);
while (it2 != nums.end()) {
max_diff.push(*it2 - *it1);
min_diff.push(*it2 - *it1);
++it1;
++it2;
}
}
};
int main() {
Zeap Z;
string command;
int x;
while (fin >> command) {
if (command == "I") {
fin >> x;
Z.insert(x);
}
else if (command == "S") {
fin >> x;
int result = Z.remove(x);
if (result == -1) {
fout << -1 << '\n';
}
}
else if (command == "C") {
fin >> x;
int result = Z.search(x);
fout << result << '\n';
}
else if (command == "MAX") {
int result = Z.maxDiff();
fout << result << '\n';
}
else if (command == "MIN") {
int result = Z.minDiff();
fout << result << '\n';
}
}
fin.close();
fout.close();
return 0;
}