package main
import (
"bufio"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
// Buffer size sufficient for word parsing
buffer := make([]byte, 1024*1024)
scanner.Buffer(buffer, 1024*1024)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
scanInt := func() int {
scanner.Scan()
res, _ := strconv.Atoi(scanner.Text())
return res
}
if !scanner.Scan() {
return
}
t, _ := strconv.Atoi(scanner.Text())
for i := 0; i < t; i++ {
n := scanInt()
k := scanInt()
pos := make([][]int, n+1)
for j := 0; j < n; j++ {
val := scanInt()
pos[val] = append(pos[val], j)
}
ans := make([]int, n)
infreq := make([]int, 0, n)
for j := 1; j <= n; j++ {
if len(pos[j]) >= k {
for c := 0; c < k; c++ {
ans[pos[j][c]] = c + 1
}
} else if len(pos[j]) > 0 {
infreq = append(infreq, pos[j]...)
}
}
m := len(infreq)
m -= m % k
for j := 0; j < m; j++ {
ans[infreq[j]] = (j % k) + 1
}
for j := 0; j < n; j++ {
writer.WriteString(strconv.Itoa(ans[j]))
if j < n-1 {
writer.WriteByte(' ')
}
}
writer.WriteByte('\n')
}
}