#include <bits/stdc++.h>
using namespace std;
int T;
int n;
pair<int, int> d[111111];
int where[222222];
int fin[2][222222];
int le[2];
vector<int> adj[222222];
bool cmp2(pair<int, int> x, pair<int, int> y) { return x.second < y.second; }
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &d[i].first);
    d[i].second = i;
  }
  sort(d + 1, d + n + 1);
  reverse(d + 1, d + n + 1);
  where[0] = 2 * d[1].second - 1;
  where[d[1].first] = 2 * d[1].second;
  fin[0][0] = 2 * d[1].second - 1;
  fin[1][0] = 2 * d[1].second;
  le[0] = 1;
  le[1] = 1;
  for (int i = 2; i <= d[1].first; i++) {
    where[i - 1] = 2 * d[i].second - 1;
  }
  for (int i = 2; i <= d[1].first; i++) {
    if (d[i].first + i - 2 < (d[1].first)) {
      adj[2 * d[i].second].push_back(where[d[i].first + i - 2]);
      adj[where[d[i].first + i - 2]].push_back(2 * d[i].second);
    } else {
      if (d[i].first + i - 2 - d[1].first + 1 < le[1]) {
        adj[2 * d[i].second].push_back(fin[1][d[i].first + i - 2 - d[1].first]);
        adj[fin[1][d[i].first + i - 2 - d[1].first]].push_back(2 * d[i].second);
      } else {
        fin[1][le[1]] = 2 * d[i].second;
        le[1]++;
      }
    }
  }
  for (int i = d[1].first + 1; i <= n; i++) {
    if (d[i].first == 1) {
      adj[where[0]].push_back(d[i].second * 2);
      adj[d[i].second * 2].push_back(where[0]);
      adj[d[i].second * 2].push_back(d[i].second * 2 - 1);
      adj[d[i].second * 2 - 1].push_back(d[i].second * 2);
    } else {
      adj[where[0]].push_back(d[i].second * 2);
      adj[d[i].second * 2].push_back(where[0]);
      adj[where[d[i].first - 2]].push_back(d[i].second * 2 - 1);
      adj[d[i].second * 2 - 1].push_back(where[d[i].first - 2]);
    }
  }
  for (int i = 0; i < d[1].first; i++) {
    adj[where[i]].push_back(where[i + 1]);
    adj[where[i + 1]].push_back(where[i]);
  }
  for (int i = 0; i < le[1] - 1; i++) {
    adj[fin[1][i]].push_back(fin[1][i + 1]);
    adj[fin[1][i + 1]].push_back(fin[1][i]);
  }
  for (int i = 0; i < 222222; i++) {
    for (auto &x : adj[i]) {
      if (x > i) printf("%d %d\n", i, x);
    }
  }
  return 0;
}
