Pagini recente » Rating Robin Gemanaru (robingemanaru) | Cod sursa (job #3002036) | Cod sursa (job #2656183) | Cod sursa (job #3031313) | Cod sursa (job #2892763)
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> per;
ifstream f("zeap.in");
ofstream g("zeap.out");
priority_queue <pair<int, per>, vector<pair<int, per>>, greater<pair<int, per>>> pq;
set <int> zeap;
string operatie;
void insereaza(int x) {
if(zeap.count(x) == 0) {
zeap.insert(x);
if(zeap.size() >= 2) {
auto index_x = zeap.find(x);
if(index_x != zeap.begin()) {
auto index_stanga = index_x;
--index_stanga;
pq.push(make_pair(abs(*index_stanga - x),
make_pair(*index_stanga, x)));
}
auto index_dreapta = index_x;
++index_dreapta;
if(index_dreapta != zeap.end())
pq.push(make_pair(abs(x - *index_dreapta),
make_pair(x, *index_dreapta)));
}
}
}
int sterge(int x) {
if(zeap.count(x) == 0)
return -1;
auto index_x = zeap.find(x);
auto index_dreapta = index_x;
++index_dreapta;
auto index_stanga = index_x;
--index_stanga;
if(index_dreapta != zeap.end() and index_x != zeap.begin())
pq.push(make_pair(abs(*index_stanga - *index_dreapta),
make_pair(*index_stanga, *index_dreapta)));
zeap.erase(x);
return 1;
}
bool cauta(int x) {
if(zeap.count(x))
return 1;
return 0;
}
int max_dif() {
if(zeap.size() < 2)
return -1;
auto sfarsit = zeap.end();
--sfarsit;
auto inceput = zeap.begin();
return *sfarsit - *inceput;
}
int min_dif() {
if(zeap.size() < 2)
return -1;
while(zeap.count(pq.top().second.first) == 0 or
zeap.count(pq.top().second.second) == 0)
pq.pop();
return pq.top().first;
}
int main() {
int x;
while(f >> operatie)
if(operatie == "I") {
f >> x;
insereaza(x);
}
else
if(operatie == "S") {
f >> x;
int value = sterge(x);
if(value == -1)
g << -1 << '\n';
}
else
if(operatie == "C") {
f >> x;
g << cauta(x) << '\n';
}
else
if(operatie == "MAX")
g << max_dif() << '\n';
else
g << min_dif() << '\n';
return 0;
}