310584: CF1855C2. Dual (Hard Version)
Description
The only difference between the two versions of this problem is the constraint on the maximum number of operations. You can make hacks only if all versions of the problem are solved.
You are given an array $a_1, a_2,\dots, a_n$ of integers (positive, negative or $0$). You can perform multiple operations on the array (possibly $0$ operations).
In one operation, you choose $i, j$ ($1 \leq i, j \leq n$, they can be equal) and set $a_i := a_i + a_j$ (i.e., add $a_j$ to $a_i$).
Make the array non-decreasing (i.e., $a_i \leq a_{i+1}$ for $1 \leq i \leq n-1$) in at most $31$ operations. You do not need to minimize the number of operations.
InputEach test contains multiple test cases. The first line contains the number of test cases $t$ ($1 \le t \le 500$). The description of the test cases follows.
The first line contains a single integer $n$ ($1 \le n \le 20$) — the length of the array.
The second line contains $n$ integers $a_1, a_2, \ldots, a_n$ ($-20 \le a_i \le 20$) — the array before performing the operations.
OutputFor each test case, output your operations in the following format.
The first line should contain an integer $k$ ($0 \le k \le 31$) — the number of operations.
The next $k$ lines represent the $k$ operations in order. Each of these $k$ lines should contain two integers $i$ and $j$ ($1 \leq i, j \leq n$) — the corresponding operation consists in adding $a_j$ to $a_i$.
After all the operations, the array $a_1, a_2,\dots, a_n$ must be non-decreasing.
ExampleInput10 2 2 1 4 1 2 -10 3 5 2 1 1 1 1 8 0 0 0 0 0 0 0 0 5 1 2 -4 3 -10 10 11 12 13 14 15 -15 -16 -17 -18 -19 7 1 9 3 -4 -3 -2 -1 3 10 9 8 20 1 -14 2 -10 6 -5 10 -13 10 7 -14 19 -5 19 1 18 -16 -7 12 8 20 -15 -17 -13 8 14 -13 10 -4 11 -4 -16 -6 15 -4 -2 7 -9 5 -5 17Output
1 2 1 3 4 4 4 4 3 4 4 2 1 3 1 4 1 5 1 0 7 3 4 3 4 5 4 5 4 5 4 5 4 5 4 15 6 1 6 1 6 1 7 2 7 2 7 2 8 3 8 3 8 3 9 4 9 4 9 4 10 5 10 5 10 5 8 3 4 3 4 2 4 2 4 2 4 2 4 1 4 1 4 3 2 1 3 1 3 1 31 14 1 18 7 13 11 15 11 6 4 5 17 19 6 19 12 10 5 11 12 1 17 15 19 16 10 14 2 16 11 20 7 7 6 9 5 3 6 6 14 17 18 18 14 12 3 17 16 8 18 13 16 9 8 14 8 16 2 11 8 12 7 31 5 12 19 13 9 1 5 17 18 19 6 16 15 8 6 9 15 14 7 10 19 7 17 20 14 4 15 20 4 3 1 8 16 12 16 15 5 6 12 10 11 15 20 3 20 19 13 14 11 14 18 10 7 3 12 17 4 7 13 2 11 13Note
In the first test case, by adding $a_1 = 2$ to $a_2$, we get the array $[2, 3]$ which is non-decreasing.
In the second test case, the array changes as:
- $[1, 2, -10, 3]$
- $[1, 2, -10, 6]$
- $[1, 2, -10, 12]$
- $[1, 2, 2, 12]$
In the third test case, the final array is $[2, 3, 3, 3, 3]$.
Input
Output
输入数据格式:第一行包含一个整数t,表示测试用例的数量。接下来每个测试用例有两行,第一行是一个整数n,表示数组长度。第二行包含n个整数,表示数组中的每个元素。
输出数据格式:对于每个测试用例,第一行输出一个整数k,表示操作的次数。接下来k行,每行两个整数i和j,表示将a[j]加到a[i]上的操作。最后输出经过操作后的非递减数组。题目大意:给定一个整数的数组,通过最多31次操作,使得数组变为非递减序列。每次操作可以选择数组中的两个位置i和j,将a[j]加到a[i]上。要求输出操作步骤及最终的非递减数组。 输入数据格式:第一行包含一个整数t,表示测试用例的数量。接下来每个测试用例有两行,第一行是一个整数n,表示数组长度。第二行包含n个整数,表示数组中的每个元素。 输出数据格式:对于每个测试用例,第一行输出一个整数k,表示操作的次数。接下来k行,每行两个整数i和j,表示将a[j]加到a[i]上的操作。最后输出经过操作后的非递减数组。