```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
var reader *bufio.Reader
var writer *bufio.Writer
func scanInt() int {
var x int
var c byte
for {
c, _ = reader.ReadByte()
if c >= '0' && c <= '9' {
x = int(c - '0')
break
}
}
for {
c, _ = reader.ReadByte()
if c >= '0' && c <= '9' {
x = x*10 + int(c-'0')
} else {
break
}
}
return x
}
func printInt(x int64) {
fmt.Fprintf(writer, "%d\n", x)
}
type BIT struct {
tree []int
size int
}
func newBIT(n int) *BIT {
return &BIT{
tree: make([]int, n+1),
size: n,
}
}
func (b *BIT) update(idx, val int) {
for idx <= b.size {
b.tree[idx] += val
idx += idx & -idx
}
}
func (b *BIT) query(idx int) int {
sum := 0
for idx > 0 {
sum += b.tree[idx]
idx -= idx & -idx
}
return sum
}
func (b *BIT) clear() {
for i := range b.tree {
b.tree[i] = 0
}
}
type Task struct {
bl, br int
al, ar int
}
func solve() {
n := scanInt()
m := scanInt()
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = scanInt()
}
b := make([]int, m)
for i := 0; i < m; i++ {
b[i] = scanInt()
}
sort.Ints(b)
vals := make([]int, 0, n+m)
vals = append(vals, a...)
vals = append(vals, b...)
sort.Ints(vals)
uniqueVals := make([]int, 0, len(vals))
if len(vals) > 0 {
uniqueVals = append(uniqueVals, vals[0])
for i := 1; i < len(vals); i++ {
if vals[i] != vals[i-1] {
uniqueVals = append(uniqueVals, vals[i])
}
}
}
getRank := func(val int) int {
idx := sort.Search(len(uniqueVals), func(i int) bool {
return uniqueVals[i] >= val
})
return idx + 1
}
ra := make([]int, n)
for i, v := range a {
ra[i] = getRank(v)
}
rb := make([]int, m)
for i, v := range b {
rb[i] = getRank(v)
}
bitSize := len(uniqueVals)
bit := newBIT(bitSize)
var currentInv int64
for i := n - 1; i >= 0; i-- {
currentInv += int64(bit.query(ra[i] - 1))
bit.update(ra[i], 1)
}
totalSmaller := make([]int, m)
for i := 0; i < m; i++ {
totalSmaller[i] = bit.query(rb[i] - 1)
}
var minCrossInv int64
tasks := []Task{{0, m - 1, 0, n}}
for len(tasks) > 0 {
var nextTasks []Task
bit.clear()
currA := 0
for _, t := range tasks {
mid := (t.bl + t.br) / 2
val := rb[mid]
for currA < t.al {
bit.update(ra[currA], 1)
currA++
}
smallerInPrefix := bit.query(val - 1)
greaterInPrefix := currA - bit.query(val)
cost := int64(totalSmaller[mid]) + int64(greaterInPrefix) - int64(smallerInPrefix)
bestCost := cost
bestPos := t.al
scanCost := cost
for k := t.al; k < t.ar; k++ {
if ra[k] < val {
scanCost--
} else if ra[k] > val {
scanCost++
}
if scanCost < bestCost {
bestCost = scanCost
bestPos = k + 1
}
}
minCrossInv += bestCost
if t.bl < mid {
nextTasks = append(nextTasks, Task{t.bl, mid - 1, t.al, bestPos})
}
if mid < t.br {
nextTasks = append(nextTasks, Task{mid + 1, t.br, bestPos, t.ar})
}
}
tasks = nextTasks
}
printInt(currentInv + minCrossInv)
}
func main() {
reader = bufio.NewReader(os.Stdin)
writer = bufio.NewWriter(os.Stdout)
defer writer.Flush()
t := scanInt()
for i := 0; i < t; i++ {
solve()
}
}
```