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

Previous submission (verdict: Wrong answer on test 1):
#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() {
    return;
}

void solve(int test) {
    int n; cin >> n;
    vi w(n + 1);
    vector<vi> res;
    for (int i = 1; i <= n; i++) {
        int x; cin >> x; w[x] = 1;
        for (int j = x + 1; j <= n; j++) {
            if (w[j]) continue;
            res.push_back({x, j});
        }
        for (int j = n; j >= 1; j--) {
            if (w[j]) continue;
            res.push_back({j, x});
        }
    }

    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;
}


Submission (verdict: Accepted):
#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() {
    return;
}

void solve(int test) {
    int n; cin >> n;
    vi w(n + 1);
    vector<vi> res;
    for (int i = 1; i <= n; i++) {
        int x; cin >> x; w[x] = 1;
        for (int j = x + 1; j <= n; j++) {
            if (w[j]) continue;
            res.push_back({j, x});
        }
        for (int j = n; j >= 1; j--) {
            if (w[j]) continue;
            res.push_back({x, j});
        }
    }

    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;
}