#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > res;
int n;
int tx[1000000], add[1000000];
void up(int i, int l, int r, int a, int b, int x) {
  if (b < l || a > r) return;
  if (a <= l && b >= r) {
    tx[i] += x;
    add[i] += x;
    return;
  }
  int m = (l + r) / 2;
  up(2 * i, l, m, a, b, x);
  up(2 * i + 1, m + 1, r, a, b, x);
  tx[i] = min(tx[2 * i], tx[2 * i + 1]) + add[i];
}
int getmin(int i, int l, int r, int a, int b) {
  if (b < l || a > r) return 1000000000;
  if (a <= l && b >= r) return tx[i];
  int m = (l + r) / 2;
  return min(getmin(2 * i, l, m, a, b), getmin(2 * i + 1, m + 1, r, a, b)) +
         add[i];
}
void com(int l, int r) {
  if (l > r) return;
  if (l == r) {
    for (int i = 0; i < getmin(1, 1, n, l, l); i++)
      res.push_back(make_pair(l, r));
    return;
  }
  int m = getmin(1, 1, n, l, r);
  if (m == 0) {
    int mid = (l + r) / 2;
    int left = l;
    int right = r;
    while (1) {
      mid = (left + right) / 2;
      if (getmin(1, 1, n, l, mid) == 0) {
        if (getmin(1, 1, n, mid, mid) == 0) {
          com(l, mid - 1);
          com(mid + 1, r);
          return;
        } else
          right = mid;
      } else
        left = mid + 1;
    }
  } else if (m > 0) {
    up(1, 1, n, l, r, -m);
    for (int i = 0; i < m; i++) res.push_back(make_pair(l, r));
    com(l, r);
  }
}
int main() {
  int k;
  scanf("%d", &n);
  ;
  for (int i = 0; i < n; i++) {
    scanf("%d", &k);
    ;
    up(1, 1, n, i + 1, i + 1, k);
  }
  com(1, n);
  cout << res.size() << endl;
  for (int i = 0; i < res.size(); i++)
    printf("%d %d\n", res[i].first, res[i].second);
  return 0;
}
