#include <bits/stdc++.h>
using namespace std;
struct data {
  int l, r, h;
};
int n, m, h[100111], lef[100111], righ[100111];
data a[100111];
bool cmp(data a, data b) {
  return (a.h < b.h) || (a.h == b.h && a.l < b.l) ||
         (a.h == b.h && a.l == b.l && a.r < b.r);
}
void input() {
  scanf("%d", &n);
  int i;
  for (i = 1; i <= n; i++) {
    scanf("%d", &h[i]);
    a[i].h = h[i];
  };
  for (i = 1; i <= n; i++)
    if (h[i] > 0) {
      a[i].l = i;
      while (h[a[i].l - 1] >= h[i]) a[i].l = a[a[i].l - 1].l;
    }
  for (i = n; i >= 1; i--)
    if (h[i] > 0) {
      a[i].r = i;
      while (h[a[i].r + 1] >= h[i]) a[i].r = a[a[i].r + 1].r;
    }
  sort(a + 1, a + n + 1, cmp);
}
void solve() {
  int i, j, k;
  for (i = 1; i <= n; i++)
    if (a[i].h > 0 && (a[i].h != a[i - 1].h || a[i].l != a[i - 1].l ||
                       a[i].r != a[i - 1].r)) {
      k = a[i].h - max(h[a[i].l - 1], h[a[i].r + 1]);
      for (j = 1; j <= k; j++) {
        lef[++m] = a[i].l;
        righ[m] = a[i].r;
      }
    }
}
void output() {
  printf("%d\n", m);
  int i;
  for (i = 1; i <= m; i++) printf("%d %d\n", lef[i], righ[i]);
}
int main() {
  input();
  solve();
  output();
}
