#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N], b[N];
int n, m;
map<int, int> posMap;
// 判断数组中是否存在重复元素
bool hasDuplicates() {
sort(b + 1, b + n + 1);
for (int i = 2; i <= n; i++) {
if (b[i] == b[i - 1]) return true;
}
return false;
}
// 判断是否存在某个长度为 m 的连续子数组,原始顺序在排序后连续
bool checkValidSequence() {
// 建立值到下标的映射(即 a[i] 在排序数组 b 中的下标)
for (int i = 1; i <= n; i++) posMap[b[i]] = i;
for (int i = 1; i + m - 1 <= n; i++) {
int j = i + 1;
// 如果当前元素在排序数组中是连续递增的
while (j <= n && posMap[a[j]] - 1 == posMap[a[j - 1]]) j++;
if (j - i >= m) return true;
i = j - 1; // 跳过检查过的部分
}
return false;
}
// 单组测试数据处理函数
void solve() {
cin >> n >> m;
// 读入数组
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
}
// 如果有重复元素,不能构成严格单调序列
if (hasDuplicates()) {
cout << "NO\n";
return;
}
// 升序检查
if (checkValidSequence()) {
cout << "YES\n";
return;
}
// 降序检查
reverse(b + 1, b + n + 1);
if (checkValidSequence()) {
cout << "YES\n";
return;
}
cout << "NO\n";
}
// 主函数,处理多个测试用例
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
posMap.clear(); // 清空映射
solve();
}
return 0;
}