Pagini recente » Cod sursa (job #543258) | Cod sursa (job #1757671) | Borderou de evaluare (job #538045) | Cod sursa (job #656724) | Cod sursa (job #2751830)
#include <fstream>
#include <set>
#include <queue>
#include <utility>
#include <math.h>
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
set<int> Elemente;
priority_queue< pair<int, pair<int, int>> > Dif_Min; // (Dif, (x1, x2))
void INSEREAZA(int x)
{
if(Elemente.find(x) == Elemente.end())
{
Elemente.insert(x);
auto it = Elemente.find(x);
if(it != Elemente.begin())
{
auto it_prev = it;
--it_prev;
int dif = abs(*it - *it_prev);
Dif_Min.push(make_pair(-dif, make_pair(*it, *it_prev)));
}
if(it != --Elemente.end())
{
auto it_next = it;
++it_next;
int dif = abs(*it_next - *it);
Dif_Min.push(make_pair(-dif, make_pair(*it, *it_next)));
}
}
}
short STERGE(int x)
{
if(Elemente.find(x) == Elemente.end())
return -1;
auto it = Elemente.find(x);
if(it != Elemente.begin() && it != --Elemente.end())
{
auto it_prev = it;
auto it_next = it;
--it_prev;
++it_next;
Dif_Min.push(make_pair(-abs(*it_next - *it_prev), make_pair(*it_prev, *it_next)));
}
Elemente.erase(x);
return 1;
}
short CAUTA(int x)
{
if(Elemente.find(x) != Elemente.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(Elemente.find(Dif_Min.top().second.first) == Elemente.end() || Elemente.find(Dif_Min.top().second.second) == Elemente.end())
Dif_Min.pop();
return -Dif_Min.top().first;
}
int main()
{
ofstream z("zeap.in");
srand(time(NULL));
for(int i = 0; i < 20; ++i)
{
int x = 1 + rand() % 5;
int val = 1 + rand() % 10;
if(x == 1)
z << "I " << val << '\n';
else if(x == 2)
z << "S " << val << '\n';
else if(x == 3)
z << "C " << val << '\n';
else if(x == 4)
z << "MAX\n";
else
z << "MIN\n";
}
z.close();
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;
}