Problem: 2052A - Adrenaline Rush
Language: C++17 (GCC 7-32)


Submission (verdict: Wrong answer on test 1):
// #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,a=0,b=0;
        cin>>n;
        vector<int>present(n+1,0), future(n+1,0), pos(n+1,0);
        priority_queue<pair<int, int>>pq;
        for(int i=1;i<=n;i++)
        {
            cin>>m;
            future[m]=i;
            present[i]=i;
            pos[i]=i;
            if(a<abs(future[i]-present[i]))
            {
                a=abs(future[i]-present[i]);
                b=i;
            }
            pq.push({(abs(future[i]-present[i])),i});
        }
        unordered_map<pair<int, int>, int, pair_hash> mp;
        
        while(!pq.empty())
        {
            int u=pq.top().second;
            int c=pq.top().first;
            pq.pop();
            if(present[u]==future[u])continue;
            int i=present[u];
            //cout<<u<< " "<<c<< " "<<i<<endl;
            while(present[u]!=future[u])
            {
                if(present[u]<future[u])
                {
                    int val=pos[i+1];
                    pos[i+1]=u;
                    pos[i]=val;
                    present[val]=i;
                    mp[{val,u}]++;
                    i++;
                    present[u]=i;
                    pq.push({abs(present[val]-future[val]),val});

                }
                else if(present[u]>future[u])
                {
                    int val=pos[i-1];
                    swap(pos[i-1],pos[i]);
                    present[val]=i;
                    mp[{u,val}]++;
                    i--;
                    present[u]=i;
                   // cout<<val<<" "<<u<<" "<<i<<endl;
                    pq.push({abs(present[val]-future[val]),val});
                }
                else
                break;

            }
           // break;
        }
        for(int i=1;i<n;i++)
        {
            int j=i+1;
            while(j<=n&&mp.find({present[i], present[j]})==mp.end()&&mp.find({ present[j],present[i]})==mp.end())
            {
                
                mp[{present[i], present[j]}]++;
                mp[{ present[j],present[i]}]++;
                j++;
            }
        }
        cout<<mp.size()<<endl;
        for(auto it:mp)
        {
            cout<<it.first.first<<" "<<it.first.second<<endl;
        }

    }
}