Pagini recente » Cod sursa (job #731794) | Cod sursa (job #1588772) | Cod sursa (job #705128) | Cod sursa (job #888559) | Cod sursa (job #2751797)
#include <fstream>
#include <set>
#include <queue>
#include <unordered_set>
#include <utility>
#include <math.h>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
set<int> Elemente;
unordered_set<int> Exista_Elem;
priority_queue< pair<int, pair<int, int>> > Dif_Min; // (Dif, (x1, x2))
void INSEREAZA(int x)
{
if(Exista_Elem.find(x) == Exista_Elem.end())
{
int dif;
for(auto it2 = Elemente.begin(); it2 != Elemente.end(); ++it2)
{
int x1 = x, x2 = *it2;
if(x1 > x2)
swap(x1, x2);
dif = abs(x2 - x1);
Dif_Min.push(make_pair(-dif, make_pair(x1, x2)));
}
Elemente.insert(x);
Exista_Elem.insert(x);
}
}
short STERGE(int x)
{
if(Exista_Elem.find(x) == Exista_Elem.end())
return -1;
Elemente.erase(x);
Exista_Elem.erase(x);
return 1;
}
short CAUTA(int x)
{
if(Exista_Elem.find(x) != Exista_Elem.end())
return 1;
return 0;
}
int MAX_DIF()
{
if(Elemente.size() < 2)
return -1;
return *(--Elemente.end()) - *Elemente.begin();
}
int MIN_DIF()
{
if(Elemente.size() < 2)
return -1;
while(Exista_Elem.find(Dif_Min.top().second.first) == Exista_Elem.end() || Exista_Elem.find(Dif_Min.top().second.second) == Exista_Elem.end())
Dif_Min.pop();
return -Dif_Min.top().first;
}
int main()
{
int NR;
char Op[4];
f >> Op;
while(f.good())
{
if(Op[0] == 'M')
{
if(Op[1] == 'I')
g << MIN_DIF() << '\n';
else
g << MAX_DIF() << '\n';
}
else
{
f >> NR;
if(Op[0] == 'I')
INSEREAZA(NR);
else if(Op[0] == 'S' && STERGE(NR) == -1)
g << -1 << '\n';
else if(Op[0] == 'C')
g << CAUTA(NR) << '\n';
}
f >> Op;
}
return 0;
}