Autogrill (soste in autostrada) Execution timed out

Salve! E’ da una settimana più o meno che sono incastrato su questo problema. Non riesco a prendere punteggio pieno per meno di mezzo secondo, e non so più come ottimizzare il codice, se non usando strutture dati o metodi diversi (che non conosco / non so usare). Chiedo aiuto, questo è il mio codice

#include <algorithm>

using namespace std;

vector<long long> autogrill;
void inizia(){
   
}

void apri(long long p){
    for (int i = 0; i < autogrill.size(); i++) {
        if(autogrill.size() == 0){
            autogrill.push_back(p);
        }
        if(autogrill[i] > p){
            autogrill.insert(autogrill.begin() + i, p);
            return;
        }
    }
    autogrill.push_back(p);
}

void chiudi(long long p){
    for (int i = 0; i < autogrill.size(); i++){
        if (autogrill[i] == p){
            autogrill.erase(autogrill.begin()+i); //elimina dal vettore l'autogrill da chiudere
            break;
        }
    }
}

long long chiedi(long long p){
     if(autogrill.size() == 1){
        return autogrill[0]; //se il vettore ha un solo elemento, lo ritorno
    }
    if(autogrill.size() != 0){ //se il vettore non è vuoto, cerco il valore giusto
        for (int i = 0; i < autogrill.size(); i++) {
            if(autogrill[i] > p){ //cerca il primo valore più grande di p nel vettore
                if(i != 0){
                    if((autogrill[i] - p) <= (p - autogrill[i-1])){ //se il primo valore più grande di p è più grande o uguale al valore che viene esattamente prima, allora ritornalo
                        //cout << "A" << endl;
                        return autogrill[i];
                    } else {
                        //cout << "B" << endl;
                        return autogrill[i-1];
                    }
                } else {
                    //cout << "E" << endl;
                        for (int i = 0; i < autogrill.size(); i++) {
                         cout << autogrill[i] << " ";
                        }
                    return autogrill[0];
                }
            }
        }
        //cout << "C" << endl;
        return autogrill[autogrill.size()-1]; //se non ci sono numeri maggiori di p, l'autogrill più vicino sarà l'ultimo, siccome l'array è ordinato
    } else {
        //cout << "D" << endl;
        return -1; //devo tornare -1 se il vettore è vuoto
    }
}

int main() {
    int Q;
    cin >> Q;

    for (int i = 0; i < Q; i++){
        long long p;
        char t;
        cin >> t >> p;
        if (t == 'a') apri(p);
        else if (t == 'c') chiudi(p);
        else cout << chiedi(p) << endl;
    }

    return 0;
}

Con i vector questo problema non si può risolvere, perché inserire o eliminare elementi in mezzo a un vector è lineare nella dimensione del vector e porta quindi a una soluzione quadratica che non può passare visti i constraints.
Va usato un set. Se non lo conosci, non è difficile da usare e dovresti trovare tutto quello che serve negli altri due recenti thread su questo problema.

Grazie per la precisazione, approfondirò il prima possibile!