#include <bits/stdc++.h>
using namespace std;
const int OO = 1e9;
const long long INF = 1e18;
const int irand(int lo, int hi) {
  return ((double)rand() / (RAND_MAX + 1.0)) * (hi - lo + 1) + lo;
}
const long long lrand(long long lo, long long hi) {
  return ((double)rand() / (RAND_MAX + 1.0)) * (hi - lo + 1) + lo;
}
template <typename T>
T getnum() {
  int sign = 1;
  T ret = 0;
  char c;
  do {
    c = getchar();
  } while (c == ' ' || c == '\n');
  if (c == '-')
    sign = -1;
  else
    ret = c - '0';
  while (1) {
    c = getchar();
    if (c < '0' || c > '9') break;
    ret = 10 * ret + c - '0';
  }
  return sign * ret;
}
inline void ini(int& x) { x = getnum<int>(); }
inline void scani(int& x) { scanf("%d", &x); }
const int N = 1e5 + 5;
int n;
int d[N];
vector<pair<int, int> > vec;
vector<int> qq[3 * N];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout.setf(ios::fixed);
  cout.setf(ios::showpoint);
  cout.precision(10);
  cin >> n;
  for (int i = 1; i <= n; i += 1) {
    cin >> d[i];
    vec.push_back(make_pair(d[i], i));
  }
  sort(vec.begin(), vec.end());
  reverse(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); i++) {
    qq[i + 1].push_back(vec[i].second * 2 - 1);
  }
  int range = n;
  for (int i = 0; i < vec.size(); i++) {
    int to = i + 1 + vec[i].first;
    if (qq[to].size() == 0) {
      qq[to].push_back(vec[i].second * 2);
      range = max(range, to);
    } else {
      qq[to - 1].push_back(vec[i].second * 2);
    }
  }
  for (int i = 1; i <= range - 1; i += 1) {
    cout << qq[i][0] << " " << qq[i + 1][0] << '\n';
  }
  for (int i = 1; i <= range; i += 1) {
    for (int j = 1; j < qq[i].size(); j++) {
      cout << qq[i][0] << " " << qq[i][j] << '\n';
    }
  }
  return 0;
}
