图论问题在程序设计竞赛中非常流行,与距离和树相关的问题也经常出现。让我们从一些定义开始。
集合是不同元素的汇集。无向简单图 $G$ 是一个二元组 $(V, E)$,其中 $V$ 是一个集合,$E$ 是 $V$ 中元素组成的无序对集合。对于图 $G = (V, E)$,我们称 $V$ 为 $G$ 的顶点集,$E$ 为 $G$ 的边集。$V$ 中的元素是顶点,$E$ 中的元素是边。
设 $u$ 和 $v$ 为 $V$ 中的顶点。从 $u$ 到 $v$ 的长度为 $k$ 的路径是一个边序列 $e_1, e_2, \dots, e_k \in E$,使得存在一个由不同顶点组成的序列 $v_1, \dots, v_{k+1}$,满足以下条件:
- $u = v_1$。
- $v = v_{k+1}$。
- $e_i = \{v_i, v_{i+1}\}$。
如果 $p$ 是从 $u$ 到 $v$ 的一条路径,则称 $u$ 和 $v$ 通过 $p$ 相连。
现在我们可以定义距离和树。给定两个顶点 $u, v \in V$,如果 $u = v$,则从 $u$ 到 $v$ 的距离 $\delta(u, v)$ 为 $0$。如果存在从 $u$ 到 $v$ 的路径,则 $\delta(u, v)$ 是形成从 $u$ 到 $v$ 的路径所需的最少边数。否则,$\delta(u, v) = \infty$。树是一种无向图,其中任意两个不同的顶点 $u$ 和 $v$ 之间恰好有一条路径相连。
Danny 给了你一个非负整数序列 $d_1, d_2, \dots, d_n$,并要求你构造一棵满足以下条件的树 $G_T = (V_T, E_T)$:
- 顶点集 $V_T = \{p_1, \dots, p_n\}$ 是二维欧几里得平面上的一组点。对于 $1 \le k \le n$,$p_k$ 的坐标为 $(\cos k\theta, \sin k\theta)$,其中 $\theta = \frac{2\pi}{n}$。
- 对于 $E_T$ 中的任意两条不同边 $\{p_a, p_b\}$ 和 $\{p_q, p_q\}$,线段 $p_a p_b$ 和 $p_q p_q$ 不相交,除非这两条边共享一个公共顶点(即 $\{p_a, p_b\} \cap \{p_q, p_q\} \neq \emptyset$)。
- 存在一个顶点 $r$,使得对于 $1 \le k \le n$,$\delta(r, p_k) = d_k$。我们称 $r$ 为 $G_T$ 的根。
如果存在这样的树,请输出边集 $E_T$。否则,输出 -1。
输入格式
第一行包含一个正整数 $n$,表示要构造的树的顶点数。第二行包含 $n$ 个非负整数 $d_1, \dots, d_n$,即 Danny 给出的序列。
输出格式
如果不存在这样的树 $G_T$,输出 -1。否则,输出 $n - 1$ 行来表示边集 $E_T$。第 $i$ 行应包含两个空格分隔的整数 $u_i$ 和 $v_i$。$E_T$ 中的第 $i$ 条边应为 $\{p_{u_i}, p_{v_i}\}$。如果存在多种解,你可以输出其中任意一种。
数据范围
- $2 \le n \le 100000$
- 对于 $1 \le k \le n$,$0 \le d_k \le n - 1$
样例
样例输入 1
5 0 1 2 1 3
样例输出 1
-1
样例输入 2
5 1 1 0 1 1
样例输出 2
1 3 3 2 3 4 5 3