Flower_Rainbow_and_Forever
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

\hspace{15pt}Flower 和 Rainbow 想种植一棵 Forever Tree,这棵树需要满足以下三个条件:
\hspace{23pt}\bullet\,Forever Tree 是一棵有根树,且第 i 个节点的权值为 a_i
\hspace{23pt}\bullet\,树上所有相邻节点的权值乘积是 4 的倍数,换句话说,对于树中每一条边 (u,v),均需满足 a_u \times a_v4 的倍数;
\hspace{23pt}\bullet\,每个节点直接连接的孩子节点数量不超过 k

\hspace{15pt}现在有一个长度为 n 的序列 a_1,a_2,\dots,a_n,依次表示每一个节点的权值,Flower 和 Rainbow 想以这个序列种植一棵 n 个节点的 Forever Tree。请你帮助他们判断是否存在一棵满足条件的树,如果存在,请输出任意一棵满足条件的树。

【名词解释】
\hspace{15pt}孩子节点:也称子节点。在一棵有根树中,所有与节点 u 直接相连,且距离根节点比 u 更远的节点,均称为 u 的孩子节点。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leq T\leq 10^4\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}第一行输入两个整数 n, k \left(1 \leq n \leq 2 \times 10^5;\, 1 \leq k \leq 10^9\right),表示序列的长度、每个节点的最大孩子数量。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n \left(1 \leq a_i \leq 10^9\right),依次表示每一个节点的权值。

\hspace{15pt}除此之外,保证单个测试文件的 n 之和不超过 2 \times 10^5

输出描述:

\hspace{15pt}对于每组测试数据,新起一行。如果不存在这样的树,直接输出 -1;否则,请参考下方的格式输出:
\hspace{23pt}\bullet\,第一行输出一个整数 x \left(1 \leq x \leq n\right),表示选择的根节点编号;
\hspace{23pt}\bullet\,此后 n-1 行,第 i 行输出两个整数 u_i, v_i \left(1 \leq u_i, v_i \leq n\right),表示第 i 条树边连接节点 u_i 和 v_i
示例1

输入

复制
6
1 1
1
4 3
1 2 3 4
4 1
1 2 3 4
5 1
2 6 2 1 2
6 2
2 2 2 2 2 2
3 1
1 4 3

输出

复制
1
4
4 1
4 2
4 3
-1
-1
6
2 5
6 5
1 4
6 4
3 5
1
1 2
2 3

说明

\hspace{15pt}对于第一组样例,树上只有一个节点,选择  作为根节点即可;
\hspace{15pt}对于第二组样例,其中一种可行的构造方案是选择 作为根节点, 均为根节点的子节点;
\hspace{15pt}对于第三组样例,可以证明,不存在一种合法的构造方案。