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: Wrong Answer)

#include<bits/stdc++.h>
#define N 100001
using namespace std;
struct S{
	long long w,dep;
	long long u,v,ne;
}a[N],e[N];
	long long n,sz[N],dy[N],fir[N],root,vis[N],sum,pan;
	bool bo=false;
void add(long long u,long long v){
	e[++sum].ne=fir[u];
	fir[u]=sum;
	e[sum].v=v;
	e[sum].u=u;
//	e[sum].w=1;
}
bool cmp(S x,S y){
	return x.w>y.w;
}
void check(long long x,long long dis){
//	if(bo)return;
	pan+=dis;
	vis[x]=1;
	for(long long i=fir[x];i;i=e[i].ne){
		long long to=e[i].v;
		if(!vis[to]){
			//if(vis[to])bo=true;
			check(to,dis+1);
		}
	}
}
void dfs(long long x,long long father){
	vis[x]=1;
	for(long long i=fir[x];i;i=e[i].ne){
		long long to=e[i].v;
		if(to!=father&&!vis[to]){
			printf("%lld %lld\n",x,to);
			dfs(to,x);
		}
	}
}
long long query(long long sum){
	long long l=1,r=n;
	while(l<r){
		long long mid=(l+r+1)>>1;
		if(a[mid].w>sum)l=mid;
		else if(a[mid].w<sum)r=mid-1;
		else {
			l=mid;
			return a[l].dep;
		}
	}
	return 0;
}
int main(){
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)scanf("%lld",&a[i].w),sz[i]=1,a[i].dep=i;
	sort(a+1,a+n+1,cmp);
	for(long long i=1;i<=n;i++){
		long long tmp=n-2*sz[a[i].dep];
		long long father=query(a[i].w-tmp);
		sz[father]+=sz[a[i].dep];
/*		if(!father){
			if(root){
				printf("-1\n");
				return 0;
			}
			root=a[i].dep;
		}
*/		if(i!=n){
			add(a[i].dep,father);
			add(father,a[i].dep);
		}
	}
	root=a[n].dep;
	check(root,0);
	if(bo){
		printf("-1\n");
		return 0;
	}
	for(long long i=1;i<=n;i++)if(!vis[i]){
		printf("-1\n");
		return 0;
	}
	if(pan!=a[n].w){
		printf("-1\n");
		return 0;
	}
	memset(vis,0,sizeof(vis));
	dfs(root,0);
}