package main
import (
"bytes"
"io"
"os"
"strconv"
)
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
t := nextInt()
var out bytes.Buffer
for ; t > 0; t-- {
n := nextInt()
m := nextInt()
posMap := make(map[int][]int, n*2)
for i := 1; i <= n; i++ {
x := nextInt()
posMap[x] = append(posMap[x], i)
}
inf := n + 1
minLAtR := make([]int, n+2)
for i := 1; i <= n; i++ {
minLAtR[i] = inf
}
for i := 0; i < m; i++ {
l := nextInt()
r := nextInt()
if l < minLAtR[r] {
minLAtR[r] = l
}
}
sufMin := make([]int, n+2)
sufMin[n+1] = inf
for i := n; i >= 1; i-- {
v := sufMin[i+1]
if minLAtR[i] < v {
v = minLAtR[i]
}
sufMin[i] = v
}
b := make([]int, n+2)
umax := 0
vmin := inf
for _, pos := range posMap {
k := len(pos)
if k < 2 {
continue
}
j := 1
for i := 0; i < k-1; i++ {
if j < i+1 {
j = i + 1
}
for j < k && sufMin[pos[j]] <= pos[i] {
j++
}
if j-1 > i {
u := pos[i]
b[u] = pos[j-1]
if u > umax {
umax = u
}
if pos[i+1] < vmin {
vmin = pos[i+1]
}
}
}
}
ans := 0
if umax != 0 {
ans = n
curr := 0
for l := 1; l <= vmin; l++ {
r := umax
if curr > r {
r = curr
}
if r-l+1 < ans {
ans = r - l + 1
}
if b[l] > curr {
curr = b[l]
}
}
}
out.WriteString(strconv.Itoa(ans))
out.WriteByte('\n')
}
os.Stdout.Write(out.Bytes())
}