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 (Clang 3.8.0) (judge verdict: Wrong Answer)

#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<iostream>
#include<algorithm>
#define maxn 100050
using namespace std;
typedef long long LL;

int n;
LL D[maxn];

int pos[maxn];

LL size[maxn];

map<LL,int> mp;

void init()
{
	scanf("%d",&n);
	for (int i=1;i<=n;++i)
	{
		pos[i]=i;
		scanf("%lld",&D[i]); 
		mp[D[i]]=i;
	}
}

int fa[maxn];

bool cmp(int i,int j)
{
	return D[i]>D[j];
}

int find(LL x)
{
	return mp.count(x)?mp[x]:0;
}

bool solve()
{
	sort(pos+1,pos+n+1,cmp);
	for (int k=1;k<n;++k)
	{
		int i=pos[k],j=find(D[i]+2LL*++size[i]-n);
		
//		cout<<i<<" "<<j<<" "<<D[i]+2LL*size[i]-n<<endl;
		if (!j||j==i)
			return 0;
		fa[i]=j;
		size[j]+=size[i];
	}
	
//	puts("YES");
	for (int k=1;k<=n;++k)
	{
		int u=pos[k];
		if (fa[u])
			printf("%d %d\n",u,fa[u]);
	}
	return 1;
}

int main()
{
//    freopen("c.in","r",stdin);
//    freopen("c.out","w",stdout);
    init();
    if (!solve())
    	printf("-1\n");
    return 0;
}