Pagini recente » Cod sursa (job #2815939) | Cod sursa (job #954592) | Cod sursa (job #582542) | Borderou de evaluare (job #488889) | Cod sursa (job #2898241)
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <set>
#include <iterator>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
string op;
int nr;
set<int> zeap; // am folosit set deoarece asta se foloseste la bst
set<int>::iterator minim, maxim, it , st , dr;
priority_queue<pair<int, pair<int, int> >, vector< pair < int, pair <int, int> > >, greater<pair< int, pair<int, int > > > > prque_min;
// eu am in prque practic fiecare minim dintre numere, si cele 2 numere. este evident de ce tinem minimul dintre ele
// dar pastram si cele 2 numere ca sa ne fie mai usor sa eliminam valabilitatea acelui minim in caz ca unul dintre
// elemente le stergem. verificam daca cele 2 nr din care minimul actual este format mai exista, si daca da
// inseamna ca este valabil.
void insereaza() {
if (zeap.find(nr) == zeap.end())
{
zeap.insert(nr);
it = zeap.find(nr);
if (it != zeap.begin())
{
it--;
prque_min.push(make_pair(nr - *it, make_pair(*it, nr)));
it++;
}
if (++it != zeap.end())
prque_min.push(make_pair(*it - nr, make_pair(*it, nr)));
}
}
void sterge() {
if (zeap.find(nr) == zeap.end())
{
fout << "-1\n";
}
else {
it = zeap.find(nr);
if (it != zeap.begin())
{
it++;
if (it != zeap.end())
{
dr = it;
it--;
st = --it;
prque_min.push(make_pair(*dr - *st, make_pair(*dr, *st))); // in caz ca avem 2 fi sa nu ratam diferenta minima dintre ei
}
}
zeap.erase(nr);
}
}
bool cauta() {
if (zeap.find(nr) == zeap.end())
return 0;
else
return 1;
}
int max_dif() {
if (zeap.size() > 1)
{
maxim = zeap.end();
minim = zeap.begin();
maxim--;
return (*maxim - *minim); // cum este sortat crescator, fiind set, vine ultimul - primul
}
else
return -1;
}
int min_dif() {
if (zeap.size() > 1)
{
while (zeap.find(prque_min.top().second.first) == zeap.end() || zeap.find(prque_min.top().second.second) == zeap.end())
{
prque_min.pop(); // elimin elementele care le am sters intre timp
}
return prque_min.top().first;
}
else
return -1;
}
int main() {
while (getline(fin, op))
{
switch (op[0]) {
case 'I' :
op.erase(0, 2);
nr = stoi(op);
insereaza();
break;
case 'S' :
op.erase(0, 2);
nr = stoi(op);
sterge();
break;
case 'C':
op.erase(0, 2);
nr = stoi(op);
fout << cauta() << "\n";
break;
case 'M' :
switch (op[1]) {
case 'A' :
fout << max_dif() << "\n";
break;
case 'I' :
fout << min_dif() << "\n";
break;
}
break;
}
}
fin.close();
fout.close();
return 0;
}