#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5, inf = 1e9;
int a[maxn];
struct segtree {
  int lb, rb;
  int mn = 0;
  segtree *l, *r;
  segtree(int _lb, int _rb) {
    lb = _lb, rb = _rb;
    if (lb == rb)
      mn = a[lb];
    else {
      int t = (lb + rb) / 2;
      l = new segtree(lb, t);
      r = new segtree(t + 1, rb);
      mn = min(l->mn, r->mn);
    }
  }
  int rmq(int lq, int rq) {
    if (lb >= lq && rb <= rq)
      return mn;
    else if (lb > rq || rb < lq)
      return inf;
    return min(l->rmq(lq, rq), r->rmq(lq, rq));
  }
};
segtree *p;
vector<pair<int, int> > ans;
void solve(int l, int r, int d) {
  if (l > r) return;
  int mn = p->rmq(l, r);
  while (mn > d) ans.push_back({l + 1, r + 1}), d++;
  int lb = l, rb = r;
  while (lb != rb) {
    int t = (lb + rb) / 2;
    if (p->rmq(l, t) == d)
      rb = t;
    else
      lb = t + 1;
  }
  solve(l, lb - 1, d);
  solve(lb + 1, r, d);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  p = new segtree(0, n - 1);
  solve(0, n - 1, 0);
  cout << ans.size() << "\n";
  for (auto x : ans) cout << x.first << " " << x.second << "\n";
  return 0;
}
