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

Previous submission (verdict: Wrong answer on test 4):
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define linf 1e18
#define pb push_back
#define siz size()
#define int long long
#define ll long long
#define ld long double
#define PII pair<int, int>
const int mod = 1e9 + 7;
using i64 = long long;
using u64 = unsigned long long;
const int N = 2e5 + 10;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

namespace my128
{
  using i128 = __int128_t;
  i128 abs(const i128 &x) { return x > 0 ? x : -x; }
  auto &operator>>(istream &it, i128 &j)
  {
    string val;
    it >> val;
    i128 ans = 0;
    bool f = 0; // 负数标记
    for (char c : val)
    {
      if (c == '-')
        f = 1;
      else if (c >= '0' && c <= '9')
        ans = ans * 10 + c - '0';
    }
    j = f ? -ans : ans;
    return it;
  }

  auto &operator<<(ostream &os, const i128 &j)
  {
    string ans;
    function<void(i128)> write = [&](i128 x)
    { if (x < 0) ans += '-', x = -x; if (x > 9) write(x / 10); ans += x % 10 + '0'; };
    write(j);
    return os << ans;
  }
}
using namespace my128;
// my128::i128 a, b;
int qpow(int a, int b)
{
  int res = 1;
  while (b)
  {
    if (b & 1)
      res = res * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return res;
}
// struct myhash
// {
//   static uint64_t hash(uint64_t x)
//   {
//     x += 0x9e3779b97f4a7c15;
//     x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
//     x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
//     return x ^ (x >> 31);
//   }
//   size_t operator()(uint64_t x) const
//   {
//     static const uint64_t SEED =
//         chrono::steady_clock::now().time_since_epoch().count();
//     return hash(x + SEED);
//   }
//   size_t operator()(pair<uint64_t, uint64_t> x) const
//   {
//     static const uint64_t SEED =
//         chrono::steady_clock::now().time_since_epoch().count();
//     return hash(x.first + SEED) ^ (hash(x.second + SEED) >> 1);
//   }
// };
// ll fac[N], invfac[N];
// void init(int n)
// {
//   fac[0] = 1;
//   for (int i = 1; i <= n; i++)
//     fac[i] = fac[i - 1] * i % mod;
//   invfac[n] = qpow(fac[n], mod - 2);
//   for (int i = n - 1; i >= 0; i--)
//     invfac[i] = invfac[i + 1] * (i + 1) % mod;
// }

// i64 C(int n, int m)
// { // 组合数
//   if (m > n || m < 0)
//     return 0;
//   return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
// }

// i64 A(int n, int m)
// { // 排列数
//   if (m > n || m < 0)
//     return 0;
//   return fac[n] * invfac[n - m] % mod;
// }

// i64 catalan(int n)
// { // 卡特兰数
//   if (n < 0)
//     return 0;
//   return C(2 * n, n) * qpow(n + 1, mod - 2) % mod;
// }
void solve()
{
  int n;
  cin >> n;
  vector<int> A(n + 1), B(n + 1);
  for (int i = 1; i <= n; i++)
    cin >> A[i];
  for (int i = 1; i <= n; i++)
    B[i] = n - i + 1;
  reverse(A.begin() + 1, A.end());
  vector<PII> ans;
  set<PII> st;
  for (int i = 1; i < n; i++)
  {
    int u = 1;
    while (B[u] != A[i])
      u++;
    for (int j = u; j > i; j--)
    {
      st.insert({B[j - 1], B[j]});
      st.insert({B[j], B[j - 1]});
      ans.push_back({B[j - 1], B[j]});
      swap(B[j - 1], B[j]);
    }
  }
  for (int i = 2; i <= n; i++)
  {
    if (!st.count({A[i - 1], A[i]}))
    {
      ans.push_back({A[i - 1], A[i]});
      ans.push_back({A[i], A[i - 1]});
    }
  }
  cout << ans.size() << endl;
  for (auto [x, y] : ans)
    cout << x << " " << y << endl;
}
signed main()
{
  IOS;
  int t = 1;
  // cin >> t;
  while (t--)
    solve();
  return 0;
}
// 3 2 1

// 1 3 2

Submission (verdict: Accepted):
#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n;
  std::cin >> n;
  std::vector<int> c(n);
  for (int i = 0; i < n; i++)
  {
    std::cin >> c[i];
    c[i]--;
  }
  std::vector<std::array<int, 2>> ans;
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n - i - 1; j++)
    {
      if (c[j] < c[j + 1])
      {
        ans.push_back({c[j + 1], c[j]});
        std::swap(c[j + 1], c[j]);
      }
    }
  }
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n - i - 1; j++)
    {
      if (c[j] > c[j + 1])
      {
        ans.push_back({c[j + 1], c[j]});
        std::swap(c[j + 1], c[j]);
      }
    }
  }
  std::reverse(ans.begin(), ans.end());

  std::cout << ans.size() << "\n";
  for (auto [x, y] : ans)
  {
    std::cout << y + 1 << " " << x + 1 << "\n";
  }

  return 0;
}