#include <bits/stdc++.h>
template <class T>
T Min(const T &a, const T &b) {
  return a < b ? a : b;
}
template <class T>
T Max(const T &a, const T &b) {
  return a > b ? a : b;
}
template <class T>
bool Chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T>
bool Chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
struct fast_input {
  static const int L = 1 << 15 | 1;
  char buf[L], *l, *r;
  fast_input() { l = r = buf; }
  void Next(char &c) {
    if (l == r) r = (l = buf) + fread(buf, 1, L, stdin);
    c = l == r ? (char)EOF : *l++;
  }
  template <class T>
  void operator()(T &x) {
    char c, f = 0;
    for (Next(c); !isdigit(c); Next(c))
      if (c == '-') f = 1;
    for (x = 0; isdigit(c); Next(c)) x = x * 10 + c - '0';
    if (f) x = -x;
  }
} input;
const int N = 200000 + 47;
int a[N], b[N], c[N], n;
std::pair<int, int> d[N];
int main() {
  input(n);
  for (int i = (1), i_end = (n); i <= i_end; ++i)
    input(d[i].first), d[i].second = i;
  std::sort(d + 1, d + n + 1, std::greater<std::pair<int, int> >());
  int nc = 0, pos = 2, ed = d[1].first + 1, ie;
  a[1] = d[1].second * 2, a[ed] = d[1].second * 2 - 1;
  for (ie = 2; ie <= n; ++ie) {
    while (ed - pos + 1 > d[ie].first && pos <= d[1].first) c[++nc] = pos++;
    if (pos > d[1].first) break;
    a[pos++] = d[ie].second * 2, a[++ed] = d[ie].second * 2 - 1;
  }
  for (int i = 1; i <= nc; ++i, ++ie) {
    a[c[i]] = d[ie].second * 2;
    b[d[ie].second * 2 - 1] = c[i] + d[ie].first - 1;
  }
  for (int i = (2), i_end = (ed); i <= i_end; ++i)
    printf("%d %d\n", a[i - 1], a[i]);
  for (int i = (1), i_end = (n * 2); i <= i_end; ++i)
    if (b[i]) printf("%d %d\n", i, a[b[i]]);
  for (int i = (ie), i_end = (n); i <= i_end; ++i) {
    printf("%d %d\n", a[1], d[i].second * 2);
    if (d[i].first != 1)
      printf("%d %d\n", a[d[i].first - 1], d[i].second * 2 - 1);
    else
      printf("%d %d\n", d[i].second * 2, d[i].second * 2 - 1);
  }
  return 0;
}
