#include <bits/stdc++.h>
using namespace std;
struct S {
  int a, b;
  S() {}
  S(int _a, int _b) {
    a = _a;
    b = _b;
  }
  const bool operator<(const S &o) const { return a < o.a; }
};
string exm;
inline void exf(void) {
  cout << exm << "\n";
  exit(0);
}
template <typename T>
inline void showAll(vector<T> &v, string sep = "") {
  for (T &here : v) cout << here << sep;
}
template <typename T>
inline void showAll(T arr[], int st, int end, string sep = "") {
  for (int i = st; i <= end; i++) cout << arr[i] << sep;
}
template <typename T>
inline vector<int> int_seperation(T N, int d = 10) {
  vector<int> v;
  while (N) {
    v.push_back(N % d);
    N /= d;
  }
  reverse(v.begin(), v.end());
  return v;
}
const int SIZE = 200009;
int level[SIZE], rev[SIZE], orig[SIZE];
pair<int, int> arr[SIZE];
vector<int> tree[SIZE];
void dfs(int node, int p) {
  for (int &next : tree[node]) {
    if (p == next) continue;
    printf("%d %d\n", node, next);
    dfs(next, node);
  }
}
void level_dfs(int node, int p, int l) {
  level[node] = l;
  rev[l] = node;
  for (int &next : tree[node]) {
    if (p == next) continue;
    level_dfs(next, node, l + 1);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  queue<int> unused;
  for (int i = 1; i <= n; i++) {
    int inp;
    scanf("%d", &inp);
    orig[i] = inp;
    arr[i] = {inp, i};
  }
  sort(arr + 1, arr + 1 + n);
  reverse(arr + 1, arr + 1 + n);
  int idx = arr[1].second;
  int last = idx * 2 - 1;
  for (int i = 1; i <= n; i++) {
    unused.push(arr[i].second * 2 - 1);
  }
  unused.pop();
  while (!unused.empty()) {
    int cur = unused.front();
    unused.pop();
    tree[last].push_back(cur);
    tree[cur].push_back(last);
    last = cur;
  }
  level_dfs(idx * 2 - 1, -1, 0);
  for (int i = 1; i <= n; i++) {
    int j = arr[i].second * 2 - 1;
    int cur_level = level[j];
    int find = cur_level + orig[j / 2 + 1] - 1;
    if (find == level[last]) {
      rev[find + 1] = j + 1;
      level[j + 1] = find + 1;
      tree[last].push_back(j + 1);
      tree[j + 1].push_back(last);
      last = j + 1;
      continue;
    }
    int k = rev[find];
    tree[j + 1].push_back(k);
    tree[k].push_back(j + 1);
  }
  dfs(idx * 2 - 1, -1);
  return 0;
}
