Problem:
Score : 900 points

Problem Statement

You are given a sequence D_1, D_2, ..., D_N of length N.
The values of D_i are all distinct.
Does a tree with N vertices that satisfies the following conditions exist?

The vertices are numbered 1,2,..., N.

The edges are numbered 1,2,..., N-1, and Edge i connects Vertex u_i and v_i.

For each vertex i, the sum of the distances from i to the other vertices is D_i, assuming that the length of each edge is 1.

If such a tree exists, construct one such tree.

Constraints

2 \leq N \leq 100000

1 \leq D_i \leq 10^{12}

D_i are all distinct.

Input

Input is given from Standard Input in the following format:

N
D_1
D_2
:
D_N

Output

If a tree with n vertices that satisfies the conditions does not exist, print -1.

If a tree with n vertices that satisfies the conditions exist, print n-1 lines.
The i-th line should contain u_i and v_i with a space in between.
If there are multiple trees that satisfy the conditions, any such tree will be accepted.

Sample Input 1

7
10
15
13
18
11
14
19

Sample Output 1

1 2
1 3
1 5
3 4
5 6
6 7

The tree shown below satisfies the conditions.

Sample Input 2

2
1
2

Sample Output 2

-1

Sample Input 3

15
57
62
47
45
42
74
90
75
54
50
66
63
77
87
51

Sample Output 3

1 10
1 11
2 8
2 15
3 5
3 9
4 5
4 10
5 15
6 12
6 14
7 13
9 12
11 13

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>

#define ln                '\n'
#define all(dat)           dat.begin(), dat.end()
#define loop(i, to)        for (int i = 0; i < to; ++i)
#define cont(i, to)        for (int i = 1; i <= to; ++i)
#define circ(i, fr, to)    for (int i = fr; i <= to; ++i)
#define foreach(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)

typedef long long          num;

using namespace std;

const int nsz = 1e5;
int n, rt, siz[nsz + 5];
num w[nsz + 5];
map<num, int> id, to;
vector<int> g[nsz + 5];
vector<pair<int, int>> ans;

num inline cmp(num a, num b) {
    return a > b;
}

num calc(int u = rt, int dep = 0) {
    num res = dep;
    for (int v : g[u]) {
        res += calc(v, dep + 1);
    }
    return res;
}

int main() {
    freopen("dat.in", "r", stdin);
    ios_base::sync_with_stdio(0);
    cin >> n;
    rt = n;
    cont (i, n) {
        cin >> w[i];
        to[w[i]] = i;
    }
    fill(siz, siz + sizeof(siz) / sizeof(int), 1);
    sort(w + 1, w + n + 1, cmp);
    cont (i, n) {
        id[w[i]] = i;
    }
    cout << ln;
    cont (u, n) {
        if (u == rt)  continue;
        int v = id[w[u] - n + 2 * siz[u]];
        if (!v) {
            cout << -1 << ln;
            return 0;
        }
        siz[v] += siz[u];
        g[v].push_back(u);
        ans.push_back({to[w[u]], to[w[v]]});
    }
    if (calc() != w[n]) {
        cout << -1 << ln;
        return 0;
    }
    for (pair<int, int> p : ans) {
        cout << p.first << ' ' << p.second << ln;
    }
}