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


Submission (verdict: Wrong answer on test 7):
#include<bits/stdc++.h>

using namespace std;
using ll = __int128;

istream &operator>>(istream &cin, ll &x) { bool flg = 0; x = 0; static string s; cin >> s; if (s[0] == '-') flg = 1, s = s.substr(1); for (char c : s) x = x * 10 + (c - '0'); if (flg) x = -x; return cin; }
ostream &operator<<(ostream &cout, ll x) { static char s[60]; if (x < 0) cout << '-', x = -x; int tp = 1; s[0] = '0' + (x % 10); while (x /= 10) s[tp++] = '0' + (x % 10); while (tp--) cout << s[tp]; return cout; }

#define all(v) v.begin(), v.end()
#define fi first
#define se second

#define int long long

int inf = 1e18;

typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef vector<int> vi;

const int N = 1e5 + 10, M = 1e6 + 10, mod = 998244353;
const int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};

int qmi(int a, int b, int c)
{
    int res = 1;
    while (b)
    {
        if (b & 1)
            res = res * a % c;
        a = a * a % c;
        b >>= 1;
    }
    return res;
}

// struct node
// {
//     int l, r;
//     int v laz;
// } tr[N * 4];

// void pushup(int u) {
//     int l = u * 2, r = u * 2 + 1;
//     tr[u].v = tr[l].v + tr[r].v;
// }

// void pushdown(int u) {
//     if (!tr[u].laz) return;
//     int l = u * 2, r = u * 2 + 1;
//     int &d = tr[u].laz;
//     tr[l].v += (tr[l].r - tr[l].l + 1) * d;
//     tr[l].laz += d;
//     tr[r].v += (tr[r].r - tr[r].l + 1) * d;
//     tr[r].laz += d;
//     d = 0;
// }

// void build(int u, int l, int r) {
//     tr[u] = {l, r};
//     if (l == r) {
//         tr[u] = {l, r, 0, 0};
//         return;
//     }
//     int mid = (l + r) >> 1;
//     build(u * 2, l, mid);
//     build(u * 2 + 1, mid + 1, r);
//     pushup(u);
// }

// void modify(int u, int l, int r, int d) {
//     if (l <= tr[u].l && tr[u].r <= r) {
//         tr[u].v += (tr[u].r - tr[u].l + 1) * d;
//         tr[u].laz += d;
//         return;
//     }
//     pushdown(u);
//     int mid = (tr[u].l + tr[u].r) >> 1;
//     if (l <= mid) modify(u * 2, l, r, d);
//     if (mid + 1 <= r) modify(u * 2 + 1, l, r, d);
//     pushup(u);
// }

// int query(int u, int l, int r) {
//     if (l <= tr[u].l && tr[u].r <= r) {
//         return tr[u].v;
//     }
//     pushdown(u);
//     int res = 0;
//     int mid = (tr[u].l + tr[u].r) >> 1;
//     if (l <= mid) res = res + query(u * 2, l, r);
//     if (mid + 1 <= r) res = res + query(u * 2 + 1, l, r);
//     pushup(u);
//     return res;
// }

void init() {
    
}

void solve(int test) {
    vector<vi> res;
    map<vi, int> idx;
    int n; cin >> n;
    vi w(n);
    for (int &c: w) cin >> c;

    vi a(n);
    for (int i = 0; i < n; i++) a[i] = i + 1;

    int cnt = 0;
    for (int x = 0; x <= 1; x++) {
        for (int i = n - 1; i >= 1; i--) {
            for (int j = n - 1; j >= 1; j--) {
                res.push_back({a[j], a[j - 1]});
                swap(a[j], a[j - 1]);

                bool f = 1;
                for (int k = 0; k < n; k++) {
                    if (a[k] != w[k]) f = 0;
                }

                if (f) {
                    cout << res.size() << "\n";
                    for (auto c: res) {
                        cout << c[0] << " " << c[1] << "\n";
                    }
                    return;
                }
            }
        }
    }

    cout << res.size() << "\n";
    for (auto c: res) {
        cout << c[0] << " " << c[1] << "\n";
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    T = 1;
    // cin >> T;
    init();
    for (int test = 1; test <= T; test++)
    {
        solve(test);
    }
    return 0;
}