// 若存在,则在原数组与排好序的数组中必存在一段是相同的,段长>=m, // 可以用map或者二分快速定位到排好序的数组中,与原数组起点相同的位置,然后走一下这一段相同的有多长。 // 注意判断是否存在相同的数(严格单调),注意递增、递减排序都要判断一遍,递减不要用lower_bound #include<bits/stdc++.h> using namespace std; const int N=2e5+6; int T; int num1[N],num2[N],num3[N]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); cin>>T; while(T--){ int n,m; cin>>n>>m; unordered_set<int> unst; bool sign=true; for(int i=0;i<n;i++){ cin>>num1[i]; num2[i]=num1[i]; num3[i]=num1[i]; if(unst.count(num1[i])) sign=false; unst.insert(num1[i]); } if(!sign){ cout<<"NO"<<endl; continue; } sort(num2,num2+n); sign=false; for(int i=0;i<n;i++){ int idx=lower_bound(num2,num2+n,num1[i])-num2; int j=i; while(j<n && idx<n && num1[j]==num2[idx]){ j++; idx++; } // cout<<i<<" "<<j<<endl; if(j-i>=m){ sign=true; break; } i=j-1; } reverse(num2,num2+n); sort(num3,num3+n); for(int i=0;i<n;i++){ int idx=lower_bound(num3,num3+n,num1[i])-num3; int j=i; idx=n-idx-1; while(j<n && idx<n && num1[j]==num2[idx]){ j++; idx++; } // cout<<i<<" "<<j<<endl; if(j-i>=m){ sign=true; break; } i=j-1; } if(sign) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }