Pagini recente » Cod sursa (job #2755950) | Cod sursa (job #2111982) | Cod sursa (job #1642413) | Cod sursa (job #215985) | Cod sursa (job #3134259)
#include <iostream>
#include <fstream>
#include <set>
#include <queue>
#include <climits>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
set<int> v;
priority_queue <pair<int, pair<int,int>>> dmin;
void vinsert(int x){
v.insert(x);
if(v.size() < 2)
return;
auto aa = v.find(x);
auto bb = next(aa);
int a;
if(aa == v.begin())
a = x;
else{
aa = prev(aa);
a = *(aa);
}
int b;
if(bb == v.end())
b = x;
else
b = *(bb);
//int b = *(bb);
//cout << "I " <<x << " "<< a << " " << b << "\n";
int aux = min(abs(x == a ? INT_MAX : x-a), abs(x == b ? INT_MAX : x-b ));
if(aux == abs(x-a))
dmin.push({-aux, {x, a}});
else
dmin.push({-aux, {x, b}});
}
void dmin_act(){
//cout<<"@";
while(v.find(dmin.top().second.first) == v.end() ||
v.find(dmin.top().second.second) == v.end()){
bool first = false;
if(v.find(dmin.top().second.first) == v.end()){
first = true;
v.erase(dmin.top().second.first);
v.erase(dmin.top().second.second);
vinsert(dmin.top().second.second);
dmin.pop();
}
if(v.find(dmin.top().second.second) == v.end()){
v.erase(dmin.top().second.second);
if(first){
continue;
}
v.erase(dmin.top().second.first);
vinsert(dmin.top().second.first);
dmin.pop();
}
}
}
int main()
{
dmin.push({-INT_MAX, {0 ,0}});
char c;
while(f >> c){
int x;
if(c == 'I'){
f >> x;
vinsert(x);
}
else if(c == 'S'){
f >> x;
//cout << "S\n";
//cout << x << " " << dmin.top().second.first << " " << dmin.top().second.second<<"\n";
if(v.find(x) == v.end()){
g << -1 << "\n";
continue;
}
else
v.erase(x);
}
else if(c == 'C'){
f >> x;
if(v.find(x) != v.end())
g << 1 << "\n";
else
g << 0 << "\n";
}
else if(c == 'M'){
f >> c;
f >> c;
//cout <<"MMN\n" << dmin.top().first << " "
//<< dmin.top().second.first << " " << dmin.top().second.second << "\n";
if(v.size() < 2)
g << -1 << "\n";
if(c == 'X'){
g << *v.rbegin() - *v.begin() << "\n";
}else{
dmin_act();
g << -dmin.top().first << "\n";
}
}
/*switch(c){
case 'I':
f >> x;
v.insert(x);
int a = *v.lower_bound(x);
int b = *v.upper_bound(x);
int aux = min(abs(x-a), abs(x-b));
if(aux == abs(x-a))
dmin.push({aux, {x, a}});
else
dmin.push({aux, {x, b}});
break;
case 'S':
f >> x;
if(dmin.top().second.first == x ||
dmin.top().second.second == x){
dmin.pop();
}
v.erase(x);
break;
case 'C':
f >> x;
if(v.find(x))
g << 1 << "\n";
else
g << 0 << "\n";
case 'M':
f >> c;
f >> c;
if(v.size() < 2)
g << -1 << "\n";
if(c == 'X'){
g << *v.rbegin() - *v.begin() << "\n";
}else{
g << dmin.top().first << "\n";
dmin.pop();
}
}*/
}
return 0;
}