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

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

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--)
        {
            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});
        }
    }
    
    for (int j = 1; j <= posicao_atual.size() - 2; j++)
    {
        if (!ultrapassagens[j][j+1])
        {
            todas_ultrapassagens.push_back({j+1,j});
            todas_ultrapassagens.push_back({j,j+1});
        }
    }
    
    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: 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);
}