#include <iostream>
#include <fstream>
#include <set>
#include <math.h>
using namespace std;
void inizia();
void apri(long long p);
void chiudi(long long p);
long long chiedi(long long p);
set<int> elenco;
int main()
{
///All'inizio gli autogrill sono tutti chiusi
fstream a, b;
a.open("input.txt", ios::in);
b.open("output.txt", ios::out);
int Q;
a >> Q;
inizia();
for (int i = 0; i < Q; i++){
long long p;
char t;
a >> t >> p;
if (t == 'a') apri(p);
else if (t == 'c') chiudi(p);
else b << chiedi(p) << endl;
}
return 0;
}
void inizia(){
return;
}
void apri(long long p){
elenco.insert(p);
}
void chiudi(long long p){
elenco.erase(p);
}
long long chiedi(long long p){
if(elenco.empty()) return -1;
auto sotto = elenco.lower_bound(p);
auto sopra = elenco.upper_bound(p);
if(*sotto != p) sotto--;
if(p < *elenco.begin()) return *elenco.begin();
if(p > *--elenco.end()) return *--elenco.end();
if(abs(p - *sotto) < abs(*sopra - p))
return *sotto;
else
return *sopra;
}
Ho pensato di risolvere il problema con i set, utilizzando lower_bound e upper_bound. Sapendo che lower_bound se non trova il valore cercato punta a quello successivo lo faccio indietreggiare di uno, di modo che punti all’elemento subito precedente a p. A questo punto se p è minore del primo elemento del set restituisco quello, mentre se p è maggiore dell’elemento più gande (con posizione --elenco.end() ) restituisco quello. Deduco poi che, se la funzione non ha ancora tornato niente, p sia compreso tra due elementi nel set, quindi controllo la loro distanza da p e restituisco quello con distanza minore.
Sottoponendo l’esercizio risultano sempre tanti output errati ma non capisco perché, qualcuno potrebbe darmi un suggerimento? Quali casi non ho preso in considerazione?
Grazie mille