Problem: 2052A - Adrenaline Rush
Language: c++17 

Solution 1 (runtime: 1186 ms):
#include <bits/stdc++.h>
using namespace std;


typedef long long ll;

int main() {
    ios::sync_with_stdio(0);
	cin.tie(0);
	// freopen("outofplace.in", "r", stdin);
    // freopen("outofplace.out", "w", stdout);

	int n; cin >> n;
	vector<int> goal(n);
	for (int i = 0; i < n; i++) {
		cin >> goal[i];
	}
	vector<pair<int, int>> moves;

	vector<int> arr(n);
	map<int, int> positions;
	for(int i = 0; i < n; i++) {
		arr[i] = i + 1;
		positions[i + 1] = i;
	}
	int pos = n -1;
	for (int pos = n - 1; pos >= 0; pos--) {
		for (int i = positions[goal[pos]]; i > 0; i--) {
			moves.emplace_back(arr[i], arr[i - 1]);
			positions[arr[i]] = i - 1;
			positions[arr[i - 1]] = i;
			swap(arr[i], arr[i - 1]);
		}
		for (int i = 0; i < pos; i++) {
			moves.emplace_back(arr[i + 1], arr[i]);
			positions[arr[i]] = i + 1;
			positions[arr[i + 1]] = i;
			swap(arr[i], arr[i + 1]);
		}
	}
	cout << moves.size() << endl;
	for (int i = 0; i < moves.size(); i++) {
		cout << moves[i].first << " " << moves[i].second << endl;
	}
	// dbg(arr);
    return 0;
}

Solution 2 (runtime: 280 ms):
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    int ans = 0;
    vector<int> c(n + 1);
    vector<int> st(n + 1);
    vector<pair<int,int>> a(0);
    for (int i = 1; i < n + 1; ++i) {
        cin >> c[i];
    }
    for (int i = 1; i < n + 1; ++i) {
        ans += i - 1;
        st[n + 1 - i] = i;
        for (int j = i; j < n; ++j) {
            a.push_back({j + 1, i});
        }
    }
    for (int i = n; i > 1; --i) {
        int tmp = c[i];
        int coord = 0;
        for (int j = 1; j < n + 1; ++j) {
            if (st[j] == tmp) {
                coord = j;
                break;
            }
        }
        while (coord < i) {
            swap(st[coord], st[coord + 1]);
            ans++;
            a.push_back({st[coord], st[coord + 1]});
            coord++;
        }
    }
/*    while (true) {
        while(c[cor] == st[cor]) {
            cor--;
            if (st[cor] == 0) {
                flag = true;
                break;
            }
        }
        if (flag) {
            break;
        }
        int tmp = cor;
        while (c[tmp] != st[tmp]) {
            swap(st[tmp], st[tmp - 1]);
            a.push_back({st[tmp - 1], st[tmp]});
            ans++;
            tmp--;
        }
    }
*/
    if (!a.empty()) {
        cout << ans << '\n';
        for (int i = 0; i < a.size(); ++i) {
            cout << a[i].first << " " << a[i].second << '\n';
        }
    } else {
        cout << 0;
    }
}


/*
последовательно взять все числа,
поставить их на своё место

*/
/*
2 3 1
3 2 1
2 3 1
2 1 3
1 2 3

рассмотреть случай, когда в конце в том же
порядке

1 2 3 4 5
2 1 3 4 5
2 3 1 4 5
2 3 4 1 5
...
1 2 3 4 5
1 3 2 4 5
1 3 4 2 5
1 3 4 5 2
...

1 2 3 4
1 2 4 3
1 4 2 3
4 1 2 3
4 2 1 3
4 2 3 1
4 3 2 1
4 2 3 1
4 2 1 3
4 1 2 3
1 4 2 3
1 4 2 3



прогнать элементы так, чтобы получилась
обратная последовательность
1 2 3
...
3 2 1
вставками получать исходную последоват-
ельность

если 2 машины едут в том же порядке,
то максимальное количество обгонов 2
если в обратном порядке, то один обгон
сначала сортируем в обратном порядке -
1 обгон, потом подгоняем под решение
2 обгон
*/