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

Solution 1 (runtime: 1249 ms):
// #include <bits/stdc++.h>
// using namespace std;
// #define lli long long  lli
// lli r = 1000006, l, d, lim = 1e6 + 1;
// map<string, lli> gp;
// lli rc[1000009];
// vector<bool> prime(lim);
// const  long long lli u = 10e9 + 7;
// vector<lli> nprime;

// void seive()
// {
//   prime[1] = 1;
//   prime[0] = 1;
//   for ( lli i = 4; i <= lim; i += 2)
//     prime[i] = 1;
//   nprime.push_back(2);

//   lli x = 0;
//   for ( lli i = 3; i <= lim; i += 2)
//   {
//     if (prime[i] == 0)
//     {

//       nprime.push_back(i);
//       // prime[i]=1;
//       for ( lli j = i * i; j <= lim; j += i * 2)
//       {
//         prime[j] = 1;
//       }
//     }
//   }
// }
// lli aexb(lli a, lli b)
// {
//   if (b == 0)
//     return 1;
//   lli x = aexb(a, b / 2);
//   x = (x * x) % u;
//   if (b & 1)
//     x = (x * a) % u;
//   return x;
// }
// lli fact()
// {
//   rc[0] = 1;
//   for (lli i = 1; i <= r; i++)
//     rc[i] = (rc[i] * i) % u;
// }

// lli ncr(lli n, lli m)
// {
//   lli a = 1, b = 1;
//   for (lli i = 1; i <= m; i++)
//   {
//     a *= i;
//     a %= u;
//   }
//   for (lli i = n; i > n - m; i--)
//   {
//     b *= i;
//     b %= u;
//   }
//   return (b / a);
// }
// // string rev(string s, lli a, lli b)
// // {
// //   lli j = 0;
// //   for (lli i = a; i <= a + (b - a) / 2; i++)
// //   {

// //     swap(s[i], s[b - j]);
// //     // cout<<i<<" "<<s<<" "<<b-j<<endl;
// //     j++;
// //   }
// //   return s;
// // }

// double distance(lli x1, lli y1, lli x2, lli y2)
// {
//   double dis = (x1 - x2) * (x1 - x2);
//   dis += ((y1 - y2) * (y1 - y2));
//   dis = sqrt(dis);
//   return dis;
// }
// vector<lli> base(200005);
// lli logbase3(lli n)
// {
//   lli cnt = 0;
//   while (n)
//   {
//     n /= 3;
//     cnt++;
//   }
//   return cnt;
// }
// lli sum(lli n)
// {
//   return ((n * (n + 1)) / 2);
// }
// lli vcr[(lli)1e5+1][2];
// string str, str1;
// lli m=0, k,n, W;
// string s="aeiou";

#include <bits/stdc++.h>
using namespace std;
#define lli long long int
const lli MOD = 1e9 + 7;
const lli BASE = 31;
lli dp[3005][3005][2];

lli find(lli r, vector<lli>&par)
{
    if(par[r]==r)return r;
    return find(par[r], par);
}
void dsu(vector<lli>&vc, vector<lli>&par, lli n)
{
    vector<lli>visited(n+1,0);
    for(lli i=1;i<=n;i++)
        {
            if(visited[i])continue;
            queue<lli>q;
            q.push(i);
            while(!q.empty())
            {   
                lli u=q.front();
                visited[u]=1;
                q.pop();
                
                lli a=find(u, par);
                lli b=find(vc[u], par);
                if(visited[vc[u]])
                {
                    par[a]=b;
                    continue;
                }
                if(a!=b)
                par[b]=a;
                
                q.push(vc[u]);
            }

        }
}
// Custom hash function for pair<int, int>
struct pair_hash {
    size_t operator()(const pair<int, int>& p) const {
        return hash<int>()(p.first) ^ hash<int>()(p.second);
    }
};
int main()
{

  lli t = 1, ca = 1;
 // cin >> t;

  while (t--)
    {
        lli n,m,b=0;
        cin>>n;
        vector<int>a(n+1,0);
        for(int i=1; i<=n; ++i) cin>>a[i];
        vector<pair<int,int>> ans;
        for(int i=1; i<=n; ++i)
            for(int j=1; j<n; ++j)
                if(a[j]<a[j+1])
                   { swap(a[j],a[j+1]),
                    ans.push_back({a[j],a[j+1]});
                    //cout<<a[j]<<" "<<a[j+1]<<endl;
                   }
        for(int i=1; i<=n; ++i)
            for(int j=1; j<n; ++j)
                if(a[j]>a[j+1])
                   { swap(a[j],a[j+1]),
                    ans.push_back({a[j],a[j+1]});
                    //cout<<a[j]<<" "<<a[j+1]<<endl;
                   }
        reverse(ans.begin(),ans.end());
        cout<<ans.size()<<endl;
        for(auto it:ans)
        cout<<it.second<<" "<<it.first<<endl;
    }
}

Solution 2 (runtime: 1140 ms):
#include <bits/stdc++.h>
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;

typedef long long ll;
ll MOD = 998244353;
typedef pair<ll, ll> pll;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<pll> vpll;
typedef vector<ll> vl;
typedef vector<vl> vvl;
#define rep(i,a,b) for(ll i=(a);i<(b);i++)
#define maxv(v) *max_element(v.begin(), v.end())
#define minv(v) *min_element(v.begin(), v.end())
#define maxa(arr, n) *max_element(arr, arr + (n))
#define mina(arr, n) *min_element(arr, arr + (n))
#define ff first
#define ss second
#define pb push_back
#define pob pop_back()
#define sz size()
#define all(v) v.begin(), v.end()
#define srt(v) sort(all(v))
#define rev(v) reverse(all(v))
#define set_bits(x) __builtin_popcountll(x)
#define lead_zero(x) __builtin_clzll(x)

typedef tree<pll, null_type, less<pll>,
             rb_tree_tag, tree_order_statistics_node_update>
    ospll;
typedef tree<ll, null_type, less<ll>,
             rb_tree_tag, tree_order_statistics_node_update>
    osll;
typedef tree<pll, null_type, less_equal<pll>,
             rb_tree_tag, tree_order_statistics_node_update>
    omspll;
typedef tree<ll, null_type, less_equal<ll>,
             rb_tree_tag, tree_order_statistics_node_update>
    omsll;
class UnionFind
{
private:
  vector<int> p, rank;

public:
  UnionFind(int n)
  {
    rank.assign(n, 0);
    p.assign(n, 0);
    iota(p.begin(), p.end(), 0);
  }

  int findSet(int i) { return (p[i] == i) ? i : p[i] = findSet(p[i]); }

  bool isSameSet(int i, int j) { return findSet(i) == findSet(j); }

  void unionSet(int i, int j)
  {
    if (!isSameSet(i, j))
    {
      int x = findSet(i), y = findSet(j);
      if (rank[x] > rank[y])
        p[y] = x;
      else
      {
        p[x] = y;
        if (rank[x] == rank[y])
          rank[y]++;
      }
    }
  }
};

ll hcf(ll a, ll b)
{
  if (b == 0)
    return a;
  return hcf(b, a % b);
}
vector<ll> fact, invFact;

ll power(ll a, ll b) {
    ll res = 1LL;
    while (b) {
        if (b & 1) {
            res = (res * a) % MOD;
        }
        a = (a * a) % MOD;
        b >>= 1;
    }
    return res;
}

void precomputeFactorials(int maxN) {
    fact.resize(maxN + 1, 1);
    invFact.resize(maxN + 1, 1);
    for (int i = 2; i <= maxN; i++) {
        fact[i] = (fact[i - 1] * i) % MOD;
    }
    invFact[maxN] = power(fact[maxN], MOD - 2);
    for (int i = maxN - 1; i >= 1; i--) {
        invFact[i] = (invFact[i + 1] * (i + 1)) % MOD;
    }
}

ll nCr(ll n, ll r) {
    if (n < r) return 0;
    return (((fact[n] * invFact[r]) % MOD) * invFact[n - r]) % MOD;
}



vector<ll> factors(ll n) // all factors of a number
{
  vector<ll> v;

  for (ll i = 1; i <= sqrtl(n); i++)
  {
    if (n % i == 0)
    {
      if (n / i == i)
      {
        v.push_back(i);
      }

      else
      {
        v.push_back(i);
        v.push_back(n / i);
      }
    }
  }

  sort(v.begin(), v.end());
  return v;
}

vector<ll> z_function(string s)
{
  int n = s.size();
  vector<ll> z(n);
  int l = 0, r = 0;
  for (int i = 1; i < n; i++)
  {
    if (i < r)
    {
      z[i] = min((ll)r - i, z[i - l]);
    }
    while (i + z[i] < n && s[z[i]] == s[i + z[i]])
    {
      z[i]++;
    }
    if (i + z[i] > r)
    {
      l = i;
      r = i + z[i];
    }
  }
  return z;
}

ll prime(ll n) // all prime factors of a number  TC = O(sqrt(n))
{
  map<ll, ll> s;
  while (n % 2 == 0)
  {
    s[2]++;
    n = n / 2;
  }
  for (ll i = 3; i <= sqrtl(n); i = i + 2)
  {
    while (n % i == 0)
    {
      s[i]++;
      n = n / i;
    }
  }
  if (n > 2)
  {
    s[n]++;
  }
  ll ans = 0;
  for (auto c : s)
  {
    ans += c.ss;
  }
  return ans;
}
// scc 
void dfs(vector<ll> adj[], vector<ll> &vis, ll node, stack<ll> &st)
{
    vis[node] = 1;
    for (auto &val : adj[node])
    {
        if (vis[val] == 0)
        {
            dfs(adj, vis, val, st);
        }
    }
 
    st.push(node);
}
 
stack<ll> toposort(vector<ll> adj[], ll n)
{
    stack<ll> st;
 
    vector<ll> vis(n + 1, 0);
 
    for (ll i = 1; i <= n; i++)
    {
        if (vis[i] == 0)
        {
            dfs(adj, vis, i, st);
        }
    }
 
    return st;
}
 
void DFS(vector<ll> trans[], ll node, vector<ll> &vis, vector<ll> &temp)
{
    vis[node] = 1;
    temp.push_back(node);
 
    for (auto &val : trans[node])
    {
        if (vis[val] == 0)
        {
            DFS(trans, val, vis, temp);
        }
    }
}
// {{1 , 2 , 3} , {4 , 5}}
vector<vector<ll>> scc(vector<ll> adj[], ll n)
{
    stack<ll> st = toposort(adj, n);
 
    vector<vector<ll>> v;
 
    vector<ll> trans[n + 1];
 
    for (ll i = 1; i <= n; i++)
    {
        for (auto &val : adj[i])
        {
            trans[val].push_back(i);
        }
    }
 
    vector<ll> vis(n + 1);
 
    while (!st.empty())
    {
        ll node = st.top();
        st.pop();
 
        if (vis[node] == 0)
        {
            vector<ll> temp;
 
            DFS(trans, node, vis, temp);
 
            v.push_back(temp);
        }
    }
 
    return v;
}
map<ll, ll> primeFactorCount(ll n) {
    map<ll, ll> primeFactors;

    // Factor out all 2's
    while (n % 2 == 0) {
        primeFactors[2]++;
        n /= 2;
    }

    // Check for odd factors
    for (ll i = 3; i * i <= n; i += 2) {
        while (n % i == 0) {
            primeFactors[i]++;
            n /= i;
        }
    }

    // If n is still greater than 1, it must be a prime number
    if (n > 1) {
        primeFactors[n]++;
    }
    
    return primeFactors;
}




void solve(){
    ll n;
    cin >> n;
    vl v(n);
    rep(i , 0 , n) cin >> v[i];
    vpll ans;
    vl req(n , 0);
    rep(i , 1 , n+1) req[i-1] = i;
    for(int i=0 ; i<n ; i++){
        ll ind = -1;
        for(int j=i ; j<n ; j++){
            if(req[j] == v[i]){
                ind = j;
                break;
            }
        }
        vpll tmp;
        for(int j=ind+1 ; j<n; j++){
            tmp.pb({req[j] , v[i]});
            ans.pb({req[j] , v[i]});
        }
        for(int i=tmp.size()-1 ; i>=0 ; i--){
            ans.pb({tmp[i].ss , tmp[i].ff});
        }
        ll j = ind-1;
        while(j >= i){
            req[j+1] = req[j];
            ans.pb({v[i] , req[j]});
            j--;
        }
        req[i] = v[i];
    }
    cout << ans.size() << endl;
    for(int i=0 ; i<ans.size() ; i++){
        cout << ans[i].ff << " " << ans[i].ss << endl;
    }
}

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int t=1;
//   cin >> t;
  while (t--)
  {
    solve();
  }
}