Problem: 2052A - Adrenaline Rush
Language: C++20 (GCC 13-64)

Previous submission (verdict: Wrong answer on test 7):
#include <iostream>
#include <vector>
using namespace std;

void carro_indice_j_ultrapassou_carro_anterior(int j, vector<int>& posicao_atual, vector<int>& indices_carros_na_pos_atual,vector<vector<bool> >& ultrapassagens, 
vector<vector<int> >& todas_ultrapassagens)
{
    int carro1 = posicao_atual[j-1];
    int carro2 = posicao_atual[j];
    ultrapassagens[carro1][carro2] = true;
    ultrapassagens[carro2][carro1] = true;
    posicao_atual[j - 1] = posicao_atual[j];
    posicao_atual[j] = carro1;
    int auxiliar = indices_carros_na_pos_atual[carro1];
    indices_carros_na_pos_atual[carro1] = indices_carros_na_pos_atual[carro2];
    indices_carros_na_pos_atual[carro2] = auxiliar;
    todas_ultrapassagens.push_back({carro2,carro1});    
}





void quantas_permutacoes(int numero_carros)
{
    vector<int> posicao_final;
    posicao_final.push_back(0);
    int x;
    for (int i = 1; i <= numero_carros; i++)
    {
        cin >> x;
        posicao_final.push_back(x); 
    }

    vector<vector<int>> todas_ultrapassagens;
    vector<int> posicao_atual;
    vector <int> indices_carros_na_pos_atual;
    for (int i = 0; i <= numero_carros; i++)
    {
        posicao_atual.push_back(i);
        indices_carros_na_pos_atual.push_back(i);
    }
    vector< vector<bool> > ultrapassagens;
    for (int i = 0; i <= numero_carros; i++)
    {
        ultrapassagens.push_back({});
        for (int j = 0; j <= numero_carros; j++)
        {
            ultrapassagens[i].push_back(false);
        }
    }

    for (int i = 1; i <= numero_carros; i++)
    {
        int carro_atual = posicao_final[i];
        int indice_carro_atual_na_pos_atual = indices_carros_na_pos_atual[carro_atual];
        for (int j = indice_carro_atual_na_pos_atual; j >= i+1; j--)
        {
            carro_indice_j_ultrapassou_carro_anterior(j, posicao_atual, indices_carros_na_pos_atual, ultrapassagens, todas_ultrapassagens);
        }
    }
    
    for (int indice_carro = 2; indice_carro<= posicao_atual.size() -1; indice_carro++)
    {
        int carro = posicao_atual[indice_carro];
        int indice_ultimo_nao_ultrapassado;
        for (int k = indice_carro-1; k >= 0; k--)
        {
            if (ultrapassagens[carro][posicao_atual[k]])
            {
                indice_ultimo_nao_ultrapassado = k + 1;
                break;
            } 
            if (k==0) indice_ultimo_nao_ultrapassado = 1;
        }
        for (int j = indice_carro; j >= indice_ultimo_nao_ultrapassado + 1;  j--)
        {
            carro_indice_j_ultrapassou_carro_anterior(j, posicao_atual, indices_carros_na_pos_atual, ultrapassagens, todas_ultrapassagens);
        }
        for (int j = indice_ultimo_nao_ultrapassado + 1; j <= indice_carro; j++)
        {
            carro_indice_j_ultrapassou_carro_anterior(j, posicao_atual, indices_carros_na_pos_atual, ultrapassagens, todas_ultrapassagens);
        }
    }
    
    cout << todas_ultrapassagens.size() << endl;
    for (int i = 0; i < static_cast<int>(todas_ultrapassagens.size());i++)
    {
        cout << todas_ultrapassagens[i][0] << " " <<  todas_ultrapassagens[i][1] << endl;
    }

}




int main()
{
    int numero_carros;
    cin >> numero_carros;
    quantas_permutacoes(numero_carros);
}

Submission (verdict: Accepted):
#include <iostream>
#include <vector>
using namespace std;


void inicializa_vetores(int numero_carros, vector<int>& pos_carros, vector<int>& indices_pos_carros, vector<int>& pos_final)
{
    for (int i = 0; i <= numero_carros; i++)
    {
        pos_carros.push_back(i);
    }
    for (int i = 0; i <= numero_carros; i++)
    {
        indices_pos_carros.push_back(i);
    }
    pos_final.push_back(0);
    for (int i = 1; i <= numero_carros; i++)
    {
        int carro;
        cin >> carro;
        pos_final.push_back(carro);
    }

}


void quantas_permutacoes(int numero_carros, vector<int>& pos_carros, vector<int>& indices_pos_carros, vector<int>& pos_final, 
vector<vector<int> >& ultrapassagens)
{
    for (int i = numero_carros; i >= 1; i--)
    {
        int iteracao = numero_carros - i + 1;

        int carro_a_ser_ultrapassado = pos_final[i];
        int indice = indices_pos_carros[carro_a_ser_ultrapassado];

        for (int j = indice - 1; j >= 1; j--)
        {
            ////cout << "iteracao " << iteracao<< " tipo " << 1.1 << ": " << carro_a_ser_ultrapassado << " " << pos_carros[j] << "\n";
            ultrapassagens.push_back({carro_a_ser_ultrapassado,pos_carros[j]});
        }
        for (int j = 1; j <= indice-1; j++)
        {
            ////cout << "iteracao " << iteracao<< " tipo " << 1.2 << ": " << pos_carros[j] << " " << carro_a_ser_ultrapassado << "\n";
            ultrapassagens.push_back({pos_carros[j],carro_a_ser_ultrapassado});
        }

        for (int j = indice; j <= i - 1; j++)
        {
            ////cout <<"iteracao " << iteracao<< " tipo " << 2 << ": " <<  pos_carros[j+1] << " " << pos_carros[j] << "\n";
            ultrapassagens.push_back({pos_carros[j+1],pos_carros[j]});
            int aux = pos_carros[j];
            pos_carros[j] = pos_carros[j+1];
            pos_carros[j+1] = aux;
            aux = indices_pos_carros[pos_carros[j]];
            indices_pos_carros[pos_carros[j]] = indices_pos_carros[pos_carros[j+1]];
            indices_pos_carros[pos_carros[j+1]] = aux;
        }
    }
}


void imprima_permutacoes(vector<vector<int> >& ultrapassagens)
{
    cout << ultrapassagens.size() << endl;
    for (int i = 0; i < static_cast<int>(ultrapassagens.size());i++)
    {
        cout << ultrapassagens[i][0] << " " <<  ultrapassagens[i][1] << endl;
    }
}






int main()
{
    int numero_carros;
    cin >> numero_carros;
    vector<int> pos_carros;
    vector<int> indices_pos_carros;
    vector<int> pos_final;
    vector<vector<int> > ultrapassagens;
    inicializa_vetores(numero_carros, pos_carros, indices_pos_carros, pos_final);
    quantas_permutacoes(numero_carros, pos_carros, indices_pos_carros, pos_final, ultrapassagens);
    imprima_permutacoes(ultrapassagens);
}