Aiuto problema Autogrill (categoria librerie)

#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

Il codice che hai mandato non dovrebbe neanche compilare sulla piattaforma perché c’è il main, e questo è un task con il grader. Per il resto il codice va bene, devi solo fare attenzione al fatto che la posizione degli autogrill è troppo grande per un int e di conseguenza hai degli overflow. Per risolvere il problema devi usare i long long nel set.

1 Mi Piace

Grazie mille, ci ho perso tutto ieri e non me ne ero accorta :smiley: :smiley: