← Home
package main

import (
	"io"
	"os"
)

type Fenwick struct {
	tree []int
	n    int
}

func NewFenwick(n int) *Fenwick {
	return &Fenwick{
		tree: make([]int, n+1),
		n:    n,
	}
}

func (fw *Fenwick) Add(i, delta int) {
	for ; i <= fw.n; i += i & -i {
		fw.tree[i] += delta
	}
}

func (fw *Fenwick) Query(i int) int {
	sum := 0
	for ; i > 0; i -= i & -i {
		sum += fw.tree[i]
	}
	return sum
}

func main() {
	in := readAll(os.Stdin)
	pos := 0

	nextInt := func() int {
		for pos < len(in) && in[pos] <= ' ' {
			pos++
		}
		if pos >= len(in) {
			return 0
		}
		res := 0
		for pos < len(in) && in[pos] > ' ' {
			res = res*10 + int(in[pos]-'0')
			pos++
		}
		return res
	}

	t := nextInt()
	if t == 0 {
		return
	}

	out := make([]byte, 0, 64*t)
	var formatInt = func(n int64) {
		if n == 0 {
			out = append(out, '0', '\n')
			return
		}
		var buf [20]byte
		i := 19
		for n > 0 {
			buf[i] = byte(n%10) + '0'
			n /= 10
			i--
		}
		out = append(out, buf[i+1:]...)
		out = append(out, '\n')
	}

	MOD := int64(998244353)
	M := 20

	for tc := 0; tc < t; tc++ {
		n := nextInt()
		k := nextInt()

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

		q := make([]int, k)
		for i := 0; i < k; i++ {
			q[i] = nextInt()
		}

		fwQ := NewFenwick(k)
		var invQ int64 = 0
		for i := 0; i < k; i++ {
			val := q[i] + 1
			invQ += int64(i - fwQ.Query(val))
			fwQ.Add(val, 1)
		}
		invQ %= MOD
		ans := (invQ * int64(n)) % MOD

		var W0 int64 = 0
		if k-1 >= M {
			terms := int64(k - M)
			W0 = (terms % MOD) * ((terms + 1) % MOD) % MOD
			W0 = (W0 * 499122177) % MOD
		}
		pairs := (int64(n) * int64(n-1) / 2) % MOD
		ans = (ans + W0*pairs) % MOD

		fwP := NewFenwick(2 * n)
		minD := -k + 1
		if minD < -M+1 {
			minD = -M + 1
		}
		maxD := k - 1
		if maxD > M-1 {
			maxD = M - 1
		}

		for i := n - 1; i >= 0; i-- {
			x := p[i]
			for d := minD; d <= maxD; d++ {
				var target int
				if d >= 0 {
					target = (x - 1) >> d
				} else {
					shift := -d
					tVal := (int64(x) << shift) - 1
					if tVal > int64(2*n) {
						target = 2 * n
					} else {
						target = int(tVal)
					}
				}
				if target > 0 {
					count := fwP.Query(target)
					if count > 0 {
						weight := k - d
						if d < 0 {
							weight = k + d
						}
						ans = (ans + int64(count)*int64(weight)) % MOD
					}
				}
			}
			fwP.Add(x, 1)
		}

		formatInt(ans)
	}
	os.Stdout.Write(out)
}

func readAll(r io.Reader) []byte {
	b, _ := io.ReadAll(r)
	return b
}