← Home
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())
}