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

题目描述

给出长为 n 的序列 a,你可以对序列 a 进行以下操作:

\bullet \选择 l,r \ (1 \leq l , r \leq n),交换 a_l ,a_r

请求出在任意多次操作后,序列 a 能否满足 a_1+a_{n}=a_2+a_{n-1}=...=a_{\lceil \frac{n}{2} \rceil}+a_{n+1-\lceil \frac{n}{2} \rceil}

可以证明如果有解,操作次数不大于 n

输入描述:

第一行包含一个整数 T \ (1 \leq T \leq 10^4),表示测试用例的组数。

每组测试用例的第一行包含一个整数 n \ (1 \leq n \leq 2 \times 10^5),表示序列 a 的长度。

每组测试用例的第二行包含 n 个整数 a_1,a_2,... \ ,a_n \ (1 \leq a_i \leq 10^9)

对于所有测试用例,保证 n 的总和不超过 2 \times 10^5

输出描述:

对于每组测试用例,如果无解,输出 "NO"。如果有解,第一行输出 "YES",第二行输出一个整数 m \ (0 \leq m \leq n),之后 m 行每行输出两个整数 l,r
示例1

输入

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

输出

复制
NO
YES
2
3 4
2 5

说明

对于第二组测试用例,交换后的序列为 3 \ 7 \ 4 \ 1 \ 5