「SFCOI-4」生活在树上
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

\hspace{15pt}生活在树上——始终热爱大地——升上天空。
\hspace{15pt}小 L 看到《生活在树上》这篇文章后不满足于在一般树上的生活,于是他想生活在 BST(Binary Search Tree,二叉搜索树^\texttt{[1]})上。
\hspace{15pt}于是他构造了一棵由 n 个节点组成、点权不重复的 BST,编号为 i 的节点的权值为 a_i,且有边相连的点对 (u, v) 满足 a_u \operatorname{xor} a_v \leq k,其中 k 为一个给定的整数。
\hspace{15pt}然而,他忘记了这棵 BST 的形态。他问你根据他的描述,能否构造出一棵 BST?如果可以,他还请你帮他还原出一棵可能的 BST。

【名词解释】
\hspace{15pt}二叉搜索树^\texttt{[1]}:满足以下全部条件的二叉树^\texttt{[2]}
\hspace{23pt}\bullet\,对于树中的每个节点,若其左子树不为空,则左子树中所有节点的值均小于该节点的值;
\hspace{23pt}\bullet\,对于树中的每个节点,若其右子树不为空,则右子树中所有节点的值均大于该节点的值。
\hspace{15pt}(注:如果您需要更多二叉搜索树相关的知识,可以参考OI-Wiki的相关章节。)

\hspace{15pt}二叉树^\texttt{[2]}:满足以下全部条件的树。
\hspace{23pt}\bullet\,二叉树可以是空集;若不为空,则由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成;
\hspace{23pt}\bullet\,每个节点要么没有父节点连接(此时该节点被称为根节点)、要么被 1 个父节点连接(此时该节点被称为父节点的子节点);
\hspace{23pt}\bullet\,每个节点连接的子节点数量要么为 0 (此时该节点被称为叶子节点),要么不超过 2,且此时每个子节点都有明确的“左”或“右”属性。

输入描述:

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

\hspace{15pt}第一行输入两个整数 n, k \left(1 \leq n \leq 10^5;\,0 \leq k < 2^{31}\right),表示节点数、给定整数。
\hspace{15pt}第二行输入 n 个两两不同的整数 a_1, a_2, \dots, a_n \left(0 \leq a_i < 2^{31}\right),表示节点的权值。保证 a 严格单调递增

输出描述:

\hspace{15pt}对于每一组测试数据,新起一行。若无解,直接输出 \texttt{NO}。否则,请参考下方的格式输出:
\hspace{23pt}\bullet\,第一行输出 \texttt{YES}
\hspace{23pt}\bullet\,此后 n 行,第 i 行输出两个整数 l_i, r_i 表示编号为 i 的节点的左右儿子编号(若无则令之为 0)。

\hspace{15pt}您可以以任何大小写形式输出答案。例如,字符串 \texttt{yEs}\texttt{yes}\texttt{Yes} 都将被视为肯定的回答。
\hspace{15pt}如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
示例1

输入

复制
2
5 5
1 2 3 4 5
5 8
1 2 3 4 8

输出

复制
Yes
0 2
0 3
0 0
1 5
0 0
No

备注: