#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <tuple>
#include <math.h>
#include <cstring>
#include <bitset>
#include <queue>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define endl '\n'
#define f first
#define s second
#define all(x) begin(x),end(x)
#define m_p make_pair()
int const INF = 1e9+10;
int main(){
int n;cin >> n;
int p;cin >> p;
int q;cin >> q;
if(p+q >= n){
cout << 1;
return 0;
}
vector<int> vc;
for(int i{};i < n;i++){
int g;cin >> g;
vc.emplace_back(g);
}
sort(all(vc));
auto check = [&](int x){
vector<vector<int>> dp(n+1,vector<int>(q+1,INF));
dp[0][0] = 0;
int lx = x*2;
queue<pii> q1;// pos,ind -> small
queue<pii> q2;// pos,ind -> large
for(int i{};i < n;i++){
while(!q1.empty() && vc[i]-q1.front().f >= x) q1.pop();
while(!q2.empty() && vc[i]-q2.front().f >= lx) q2.pop();
for(int j{};j <= q;j++){
dp[i+1][j] = dp[i][j]+1;
if(!q1.empty()) dp[i+1][j] = min(dp[i+1][j],dp[q1.front().s][j]+1);
if(j > 0){
dp[i+1][j] = min(dp[i][j-1],dp[i+1][j]);
if(!q2.empty()) dp[i+1][j] = min(dp[i+1][j],dp[q2.front().s][j-1]);
}
//cout << dp[i+1][j] << " ";
}
//cout << endl;
q1.emplace(vc[i],i);
q2.emplace(vc[i],i);
}
if(dp[n][q] <= p) return true;
else return false;
};
int l = 1;
int r = 1000000000;
int ans = r;
while(l <= r){
int md = l+(r-l)/2;
if(check(md)) ans = min(ans,md),r = md-1;
else l = md+1;
}
cout << ans;
}