```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
const maxBufferSize = 8 * 1024 * 1024
var scanner *bufio.Scanner
var out *bufio.Writer
func init() {
scanner = bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, maxBufferSize), maxBufferSize)
scanner.Split(bufio.ScanWords)
}
func readInt() int {
scanner.Scan()
res := 0
for _, b := range scanner.Bytes() {
res = res*10 + int(b-'0')
}
return res
}
type Node struct {
mat [2][2]int
}
var tree []Node
func build(node, l, r int) {
if l == r {
tree[node].mat = [2][2]int{{0, 0}, {0, 0}}
return
}
mid := (l + r) / 2
build(2*node, l, mid)
build(2*node+1, mid+1, r)
tree[node].mat = [2][2]int{{0, 0}, {0, 0}}
}
func multiply(A, B [2][2]int) [2][2]int {
var C [2][2]int
C[0][0] = (A[0][0] & B[0][0]) | (A[0][1] & B[1][0])
C[0][1] = (A[0][0] & B[0][1]) | (A[0][1] & B[1][1])
C[1][0] = (A[1][0] & B[0][0]) | (A[1][1] & B[1][0])
C[1][1] = (A[1][0] & B[0][1]) | (A[1][1] & B[1][1])
return C
}
func update(node, l, r, idx, x, y, val int) {
if l == r {
tree[node].mat[x][y] = val
return
}
mid := (l + r) / 2
if idx <= mid {
update(2*node, l, mid, idx, x, y, val)
} else {
update(2*node+1, mid+1, r, idx, x, y, val)
}
tree[node].mat = multiply(tree[2*node].mat, tree[2*node+1].mat)
}
func query(node, l, r, ql, qr int) [2][2]int {
if ql <= l && r <= qr {
return tree[node].mat
}
mid := (l + r) / 2
if qr <= mid {
return query(2*node, l, mid, ql, qr)
}
if ql > mid {
return query(2*node+1, mid+1, r, ql, qr)
}
return multiply(query(2*node, l, mid, ql, qr), query(2*node+1, mid+1, r, ql, qr))
}
type EdgeInfo struct {
to int
idx int
is_forward bool
}
type Event struct {
val int
leaf int
x int
y int
}
type EventGroup struct {
val int
start int
end int
}
func get_val(pos, state, n int, A []int) int {
if state == 0 {
return A[pos]
}
return A[(pos+n)%(2*n)]
}
func solve() {
n := readInt()
A := make([]int, 2*n)
for i := 0; i < 2*n; i++ {
A[i] = readInt()
}
adj := make([][]EdgeInfo, n)
for j := 0; j < n; j++ {
u := (2 * j) % n
w := (2*j + 1) % n
adj[u] = append(adj[u], EdgeInfo{to: w, idx: j, is_forward: true})
adj[w] = append(adj[w], EdgeInfo{to: u, idx: j, is_forward: false})
}
visited_vertex := make([]bool, n)
visited_edge := make([]bool, n)
var cycles [][]EdgeInfo
for i := 0; i < n; i++ {
if !visited_vertex[i] {
curr := i
var cycle []EdgeInfo
for {
visited_vertex[curr] = true
moved := false
for _, edge := range adj[curr] {
if !visited_edge[edge.idx] {
visited_edge[edge.idx] = true
cycle = append(cycle, edge)
curr = edge.to
moved = true
break
}
}
if !moved {
break
}
}
cycles = append(cycles, cycle)
}
}
num_cycles := len(cycles)
cycle_start := make([]int, num_cycles)
cycle_end := make([]int, num_cycles)
leaf_to_cycle := make([]int, n)
leaf_is_forward := make([]bool, n)
edge_to_leaf := make([]int, n)
leaf_idx := 0
for c, cycle := range cycles {
cycle_start[c] = leaf_idx
for _, edge := range cycle {
leaf_to_cycle[leaf_idx] = c
leaf_is_forward[leaf_idx] = edge.is_forward
edge_to_leaf[edge.idx] = leaf_idx
leaf_idx++
}
cycle_end[c] = leaf_idx - 1
}
events := make([]Event, 0, 4*n)
for j := 0; j < n; j++ {
leaf := edge_to_leaf[j]
is_fw := leaf_is_forward[leaf]
for x := 0; x < 2; x++ {
for y := 0; y < 2; y++ {
var val int
if is_fw {
val = get_val(2*j, x, n, A) + get_val(2*j+1, y, n, A)
} else {
val = get_val(2*j, y, n, A) + get_val(2*j+1, x, n, A)
}
events = append(events, Event{val: val, leaf: leaf, x: x, y: y})
}
}
}
sort.Slice(events, func(i, j int) bool {
return events[i].val < events[j].val
})
groups := make([]EventGroup, 0, 4*n)
for i := 0; i < len(events); {
j := i
for j < len(events) && events[j].val == events[i].val {
j++
}
groups = append(groups, EventGroup{val: events[i].val, start: i, end: j})
i = j
}
if len(tree) < 4*n+10 {
tree = make([]Node, 4*n+10)
}
build(1, 0, n-1)
valid_cycles := 0
cycle_status := make([]int, num_cycles)
affected_seen := make([]bool, num_cycles)
affected := make([]int, 0, num_cycles)
ans := int64(3e18)
p_L := 0
p_R := 0
for p_R < len(groups) {
affected = affected[:0]
for i := groups[p_R].start; i < groups[p_R].end; i++ {
ev := events[i]
update(1, 0, n-1, ev.leaf, ev.x, ev.y, 1)
c := leaf_to_cycle[ev.leaf]
if !affected_seen[c] {
affected_seen[c] = true
affected = append(affected, c)
}
}
for _, c := range affected {
mat := query(1, 0, n-1, cycle_start[c], cycle_end[c])
ns := mat[0][0] | mat[1][1]
valid_cycles += ns - cycle_status[c]
cycle_status[c] = ns
affected_seen[c] = false
}
for valid_cycles == num_cycles {
diff := int64(groups[p_R].val) - int64(groups[p_L].val)
if diff < ans {
ans = diff
}
affected = affected[:0]
for i := groups[p_L].start; i < groups[p_L].end; i++ {
ev := events[i]
update(1, 0, n-1, ev.leaf, ev.x, ev.y, 0)
c := leaf_to_cycle[ev.leaf]
if !affected_seen[c] {
affected_seen[c] = true
affected = append(affected, c)
}
}
for _, c := range affected {
mat := query(1, 0, n-1, cycle_start[c], cycle_end[c])
ns := mat[0][0] | mat[1][1]
valid_cycles += ns - cycle_status[c]
cycle_status[c] = ns
affected_seen[c] = false
}
p_L++
}
p_R++
}
fmt.Fprintln(out, ans)
}
func main() {
out = bufio.NewWriter(os.Stdout)
defer out.Flush()
t := readInt()
for i := 0; i < t; i++ {
solve()
}
}
```