乘鲨破浪
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

\hspace{15pt}n 个人被困在了 A 岸,他们需要回到 B 岸,那里才是他们的家。
\hspace{15pt}A 岸有自配一艘小船,一次最多只能容纳两个人(包括驾驶船的人),第一趟航行从 A 岸前往 B 岸,之后航行方向交替进行(A → B,B → A,A → B,……)。在这 n 个人中,有 m 个人会开船,他们的编号分别为 b_1, b_2, \dots, b_m,每次航行,船上至少需要有一名会开船的人。任何人都可以乘船多次往返两岸。

\hspace{15pt}这里的每个人都有自己的性格,其中第 i 个人的性格为 a_i,因为大家困在 A 岸许久,所以衍生了一个冲突参数 k
\hspace{23pt}\bullet\,如果船上只有一个人,则什么都不发生;
\hspace{23pt}\bullet\,如果船上不止一个人,对于任意两个人(设其性格值分别为 xy),如果满足 x \bmod y = ky \bmod x = k,则他们会发生冲突,所以这两个人不能同时在船上。

\hspace{15pt}问是否存在一种过河方案,使得所有人都能在不发生冲突的前提下到达 B 岸?如果存在,请你输出一套可行的方案:
\hspace{23pt}\bullet\,由于只有一艘船,所以只需要输出每次在船上的人的编号即可。注意,初始时船和所有人都在 A 岸,你需要按照航行顺序输出每次船上的人的编号(如果只有一个人,则输出两个相同的编号,用一个空格隔开)。

【名词解释】
\hspace{15pt}\bmod:代表取模运算。例如,5 除以 3 的余数为 2,因此式子 5 \bmod 3 的值为 2

输入描述:

\hspace{15pt}第一行输入三个整数 nmk\left(1 \le n \le 5 \times 10^3;\, 1 \le m \le n;\, 0 \le k \le 10^9\right),表示人数和冲突参数。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n\left(1 \le a_i \le 10^9\right),表示每个人的性格值。
\hspace{15pt}第三行输入 m 个两两不同的整数 b_1, b_2, \dots, b_m\left(1 \le b_i \le n\right),表示会开船的人的编号。

输出描述:

\hspace{15pt}如果不存在可行的方案,直接输出 \texttt{NO};否则,请参考下方的格式输出:
\hspace{23pt}\bullet\,第一行输出 \texttt{YES}
\hspace{23pt}\bullet\,第二行输出一个整数 q \left(1 \le q \le 10^6\right),表示船行驶的次数;
\hspace{23pt}\bullet\,此后 q 行,第 i 行输出两个整数 u_iv_i,表示第 i 次航行时船上的人的编号(若只有一人则两个编号相同)。
示例1

输入

复制
5 4 1
2 4 5 7 29
1 3 4 5

输出

复制
YES
7
3 5
3 3
1 2
5 5
3 5
3 3
3 4

说明

\hspace{15pt}在这个样例中,所展示的合法乘船方案是:
\hspace{23pt}\bullet\,先让第三位和第五位到 B 岸;
\hspace{23pt}\bullet\,第三位自己一个人开船回到 A 岸;
\hspace{23pt}\bullet\,此时第一、二、三、四位都在 A 岸,第五位在 B 岸;
\hspace{23pt}\bullet\,……

备注: