一直没想到二分然后想正解 看了别人说才想到
那么这题就简单了 二分答案然后验证
check函数为 判断第K大的数大于等于x的区间数
面向结果编程.....

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll const  N=1e5+10;
ll n,m,k,a[N],t;

bool check(ll x)
{
    ll num=0,s=0;
    for(int i=1,j=1;j<=n;j++)
    {
        if(a[j]>=x) num++;///值大于X
        if(num==k)///出现k个值大于等于X
        {
            s+=n-j+1;///将右边界大于等于j的区间都算上
            while(a[i]<x) s+=n-j+1,i++;///左边界右移 如果num没少 又加一次右边界等于大于j的区间
            num--;i++;///这个左边界值大于X
        }
    }
    return s>=m;
}

int main()
{
    scanf("%lld",&t);
    while(t--)
    {
         scanf("%lld%lld%lld",&n,&k,&m);
         for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
         ll l=1,r=1e9,ans=0,mid;
         while(l<=r)
         {
            mid=(l+r)>>1;
            if(check(mid))ans=mid,l=mid+1;
            else  r=mid-1;
         }
         printf("%lld\n",ans);
    }
    return 0;
}