#include <bits/stdc++.h>
using namespace std;
const long long maxn = 3e5 + 7, mod = 998244353, inf = 1e18, MAXN = 1e6 + 7;
const double eps = 1e-9;
mt19937 rnd(time(0));
long long n;
long long cnt[maxn];
struct state {
  long long a, b, d;
  state(long long a, long long b, long long d) : a(a), b(b), d(d) {}
  state() : a(0), b(0), d(0) {}
};
vector<state> have;
bool cmp(state p1, state p2) { return p1.d > p2.d; }
vector<long long> gr[maxn];
vector<long long> step[maxn];
void solve() {
  cin >> n;
  for (long long i = 1; i <= n; ++i) {
    long long d;
    cin >> d;
    long long a = 2 * i;
    long long b = a - 1;
    have.emplace_back(b, a, d);
  }
  sort(have.begin(), have.end(), cmp);
  vector<long long> even;
  for (auto v : have) {
    even.push_back(v.a);
  }
  for (long long i = 1; i < n; ++i) {
    gr[even[i - 1]].push_back(even[i]);
  }
  long long size = n;
  for (long long i = 0; i < n; ++i) {
    --size;
    long long d = have[i].d;
    long long b = have[i].b;
    if (size < d) {
      gr[even.back()].push_back(b);
      even.push_back(b);
      ++size;
    } else {
      gr[even[i + d - 1]].push_back(b);
    }
  }
  for (long long i = 1; i <= 2 * n; ++i) {
    for (auto v : gr[i]) {
      cout << i << " " << v << '\n';
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(20);
  cout << fixed;
  long long t = 1;
  for (long long i = 0; i < t; ++i) {
    solve();
  }
  return 0;
}
