#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <vector>
using namespace std;
const int MAX = 1e5+100;
struct cao{
int l,r;
}fuck[MAX];
int cnt;
struct hh{
int val;
int id;
}dp[MAX][20];
int a[MAX];
void makeRMQ(int n){
for (int i = 1; i <= n;i++){
dp[i][0].val=a[i];
dp[i][0].id=i;
}
for (int j = 1; (1<<j)-1<=n;j++){
for (int i = 1;i<=n-(1<<j)+1;i++){
if(dp[i][j-1].val<=dp[i+(1<<j-1)][j-1].val) dp[i][j]=dp[i][j-1];
else dp[i][j]=dp[i+(1<<j-1)][j-1];
}
}
}
hh rmqIndex(int s,int v){
int k=(int)(log(v-s+1.0)/log(2.0));
if(dp[s][k].val<=dp[v-(1<<k)+1][k].val) return dp[s][k];
else return dp[v-(1<<k)+1][k];
}
void solve(int l,int r,int base){
if(l>r) return;
hh tmp=rmqIndex(l,r);
for (int i = base+1; i <= tmp.val;i++){
fuck[cnt].l=l;
fuck[cnt++].r=r;
}
solve(l,tmp.id-1,tmp.val);
solve(tmp.id+1,r,tmp.val);
}
int main(){
int n;
scanf("%d",&n);
for (int i = 1; i <= n;i++) scanf("%d",&a[i]);
makeRMQ(n);
solve(1,n,0);
printf("%d\n",cnt);
for (int i = 0; i< cnt;i++){
printf("%d %d\n",fuck[i].l,fuck[i].r);
}
return 0;
}