/*
最小值最大用二分,枚举起点,二分答案,判断答案是否合法
因为L*M<N,每选L次起点,判断需要修补的最小值,如果比M小
答案可以更大一点,如果比M大,答案小一点
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100000000
int a[1010];
int L,M,N;
最小值最大用二分,枚举起点,二分答案,判断答案是否合法
因为L*M<N,每选L次起点,判断需要修补的最小值,如果比M小
答案可以更大一点,如果比M大,答案小一点
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100000000
int a[1010];
int L,M,N;
int bsol(int x)
{
int num=0;
for(int i=0;i<N;i++)
{
if(a[i]<x)
{
num++;
i+=(L-1);
}
}
return num;
}
{
int num=0;
for(int i=0;i<N;i++)
{
if(a[i]<x)
{
num++;
i+=(L-1);
}
}
return num;
}
int main()
{
cin>>N>>M>>L;
for(int i=0;i<N;i++)
cin>>a[i];
int l=0,r=maxn;
while(l<=r)
{
int mid=(l+r)>>1;
int num=100000;
for(int i=0;i<L;i++)
{
for(int j=0;j<N-1;j++)
swap(a[j],a[j+1]);//枚举起点
num=min(num,bsol(mid));
}
if(num<=M)
l=mid+1;
else
r=mid-1;
}
cout<<r<<endl;
}
{
cin>>N>>M>>L;
for(int i=0;i<N;i++)
cin>>a[i];
int l=0,r=maxn;
while(l<=r)
{
int mid=(l+r)>>1;
int num=100000;
for(int i=0;i<L;i++)
{
for(int j=0;j<N-1;j++)
swap(a[j],a[j+1]);//枚举起点
num=min(num,bsol(mid));
}
if(num<=M)
l=mid+1;
else
r=mid-1;
}
cout<<r<<endl;
}