题意:


解法:






时间复杂度:

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
const int maxn = 100005;
ll a[maxn];
ll n,k,m;
bool check(int x){
    ll cnt = 0,ans = 0;
    int i = 1, j = 1;//j左指针,i右指针
    for(;i<=n;i++){
        if(a[i] >= x)
            cnt++;
        if(cnt == k){//区间大于等于x的个数等于k
            ans += (n-i+1);//那么右边的所有点都可添加到这个区间
            while(a[j] < x){
                ans += (n-i+1),j++;//左指针往右移动,直到遇到大于等于x的值
                //每次移动不成功,那么当前的点可以和右指针右边所有的点算上
            }
            cnt--;//减少1
            j++;//左指针往右移动一个
        }
    }
    return ans >= m;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        cin>>n>>k>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        ll l = 1 , r = 1e9, mid , ans ;
        while(l <= r){
            mid = (l+r)>>1;
            if(check(mid))
                ans = mid,l = mid + 1;
            else
                r = mid - 1;
        }
        cout<<ans<<endl;
    }
    return 0;
}