← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	val := 0
	c, err := fs.r.ReadByte()
	for err == nil && c <= ' ' {
		c, err = fs.r.ReadByte()
	}
	if err != nil {
		return 0
	}
	if c == '-' {
		sign = -1
		c, err = fs.r.ReadByte()
	}
	for err == nil && c >= '0' && c <= '9' {
		val = val*10 + int(c-'0')
		c, err = fs.r.ReadByte()
	}
	return sign * val
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	t := in.NextInt()
	for ; t > 0; t-- {
		n := in.NextInt()
		k := in.NextInt()
		b := make([]int, n)
		hasFixed := false

		for i := 0; i < n; i++ {
			x := in.NextInt() - 1
			b[i] = x
			if k > 1 && x == i {
				hasFixed = true
			}
		}

		if k == 1 {
			ok := true
			for i := 0; i < n; i++ {
				if b[i] != i {
					ok = false
					break
				}
			}
			if ok {
				fmt.Fprintln(out, "YES")
			} else {
				fmt.Fprintln(out, "NO")
			}
			continue
		}

		if hasFixed {
			fmt.Fprintln(out, "NO")
			continue
		}

		found := false
		mark := make([]bool, n)
		seen := make([]int, n)
		pos := make([]int, n)
		iterId := 1

		for i := 0; i < n && !found; i++ {
			if mark[i] {
				continue
			}
			u := i
			steps := 0
			for {
				if mark[u] {
					break
				}
				if seen[u] == iterId {
					cycleLen := steps - pos[u]
					if cycleLen == k {
						found = true
					}
					break
				}
				seen[u] = iterId
				pos[u] = steps
				steps++
				u = b[u]
			}
			v := i
			for {
				if mark[v] {
					break
				}
				if seen[v] != iterId {
					break
				}
				mark[v] = true
				v = b[v]
			}
			iterId++
		}

		if found {
			fmt.Fprintln(out, "YES")
		} else {
			fmt.Fprintln(out, "NO")
		}
	}
}