← Home
```go
package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
)

type State struct {
	sum       int32
	prev_mask uint16
	prev_r    int8
}

var dp [1 << 15][15][16]State
var tc_id [1 << 15][15][16]uint16
var sum_of_sub [1 << 15]int32

type ValidState struct {
	r   int8
	m   int8
	sum int32
}

var vs [256]ValidState

type Merge struct {
	from int
	to   int
}

type Op struct {
	i, j int
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, bufio.MaxScanTokenSize)

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	scanInt := func() int {
		scanner.Scan()
		res := 0
		for _, b := range scanner.Bytes() {
			res = res*10 + int(b-'0')
		}
		return res
	}

	if !scanner.Scan() {
		return
	}

	resT := 0
	for _, b := range scanner.Bytes() {
		resT = resT*10 + int(b-'0')
	}
	T := uint16(resT)

	var a [15]int32

	for current_tc := uint16(1); current_tc <= T; current_tc++ {
		n := scanInt()
		for i := 0; i < n; i++ {
			a[i] = int32(scanInt())
		}

		sum_of_sub[0] = 0
		for sub := 1; sub < 1<<n; sub++ {
			lsb := sub & -sub
			if sub == lsb {
				sum_of_sub[sub] = a[bits.TrailingZeros32(uint32(sub))]
			} else {
				sum_of_sub[sub] = sum_of_sub[sub^lsb] + sum_of_sub[lsb]
			}

			r := int8(bits.TrailingZeros32(uint32(sub)))
			dp[sub][r][1] = State{sum: sum_of_sub[sub], prev_mask: 0, prev_r: -1}
			tc_id[sub][r][1] = current_tc
		}

		for mask := 1; mask < 1<<n; mask++ {
			vs_count := 0
			for r := 0; r < n; r++ {
				for m := 1; m <= n; m++ {
					if tc_id[mask][r][m] == current_tc {
						vs[vs_count] = ValidState{r: int8(r), m: int8(m), sum: dp[mask][r][m].sum}
						vs_count++
					}
				}
			}

			if vs_count == 0 {
				continue
			}

			comp := ((1 << n) - 1) ^ mask
			for sub := comp; sub > 0; sub = (sub - 1) & comp {
				s_sum := sum_of_sub[sub]
				for i := 0; i < vs_count; i++ {
					if s_sum > vs[i].sum {
						masked := uint32(sub) & (0xFFFFFFFF << (vs[i].r + 1))
						if masked != 0 {
							new_r := int8(bits.TrailingZeros32(masked))
							nm := mask | sub
							nm_m := vs[i].m + 1

							if tc_id[nm][new_r][nm_m] != current_tc || dp[nm][new_r][nm_m].sum > s_sum {
								dp[nm][new_r][nm_m] = State{
									sum:       s_sum,
									prev_mask: uint16(mask),
									prev_r:    vs[i].r,
								}
								tc_id[nm][new_r][nm_m] = current_tc
							}
						}
					}
				}
			}
		}

		best_m := int8(-1)
		best_r := int8(-1)
		full_mask := (1 << n) - 1
		for m := n; m >= 1; m-- {
			for r := 0; r < n; r++ {
				if tc_id[full_mask][r][m] == current_tc {
					best_m = int8(m)
					best_r = int8(r)
					break
				}
			}
			if best_m != -1 {
				break
			}
		}

		var merges []Merge
		curr_mask := uint16(full_mask)
		curr_r := best_r
		curr_m := best_m

		for curr_m > 0 {
			state := dp[curr_mask][curr_r][curr_m]
			prev_mask := state.prev_mask
			prev_r := state.prev_r

			sub := curr_mask ^ prev_mask

			for i := 0; i < n; i++ {
				if i != int(curr_r) && (sub&(1<<i)) != 0 {
					merges = append(merges, Merge{from: i, to: int(curr_r)})
				}
			}

			curr_mask = prev_mask
			curr_r = prev_r
			curr_m--
		}

		current_array := make([]int, n)
		for i := 0; i < n; i++ {
			current_array[i] = i
		}

		ops := make([]Op, 0, len(merges))
		for _, merge := range merges {
			from_idx := -1
			to_idx := -1
			for i, orig := range current_array {
				if orig == merge.from {
					from_idx = i
				}
				if orig == merge.to {
					to_idx = i
				}
			}
			ops = append(ops, Op{i: from_idx + 1, j: to_idx + 1})
			current_array = append(current_array[:from_idx], current_array[from_idx+1:]...)
		}

		fmt.Fprintln(out, len(ops))
		for _, op := range ops {
			fmt.Fprintln(out, op.i, op.j)
		}
	}
}
```