#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
typedef long long ll;
#define endl '\n'
using namespace std;
const int N=32010;
int a[N];
int b[N];
int S=0;
vector<pair<int,int> >ans;
void go(int l,int r){
    S+=r-l+1;
    ans.push_back({l,r});
    reverse(a+l,a+r+1);
    reverse(b+l,b+r+1);
}
void Sort01(int l,int r){
    if (l==r) return;
    int m=(l+r)/2;
    Sort01(l,m);
    Sort01(m+1,r);
    int L=-1;
    int R=-1;
    for (int i=l;i<=m;i++){
        if (b[i]){
            L=i;
            break;
        }
    }
    for (int i=r;i>=m+1;i--){
        if (b[i]==0){
            R=i;
            break;
        }
    }
    if (L!=-1 && R!=-1){
        go(L,R);
    }
}
void Sort(int l,int r){
    if (l==r) return;
    int m=(l+r)/2;
    vector<pair<int,int> >v;
    for (int i=l;i<=r;i++){
        v.push_back({a[i],i});
    }
    sort(v.begin(),v.end());
    for (int i=0;i<v.size();i++){
        b[v[i].second]=((l+i)>m);
    }
    Sort01(l,r);
    Sort(l,m);
    Sort(m+1,r);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i];
    Sort(1,n);
    if (!is_sorted(a+1,a+n+1)) exit(1);
    cout<<ans.size()<<endl;
    for (auto cur:ans){
        cout<<cur.first<<" "<<cur.second<<endl;
    }
    return 0;
}
/**
5 8
2 1
1 3
4 2
5 2
3 4
3 5
4 5
5 4
**/
