#include <bits/stdc++.h>
// #ifndef ONLINE_JUDGE
// #include "algo/debug.h"
// #endif
using namespace std;
#define int long long
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
const int sz = 2e3 + 5, inf = 1e18, mod = 998244353;
int a[sz], dp[sz][sz];
void _(){
int n, p, q;
cin >> n >> p >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1);
p = min(p, n);
q = min(q, n);
int l = 1, r = (int)1e9, best = r;
while (l <= r) {
int mid = (l + r) >> 1;
vector<int> nxts(n + 1), nxtl(n + 1);
for (int i = 1; i <= n; i++) {
nxts[i] = upper_bound(a + 1, a + n + 1, a[i] + mid - 1) - a - 1;
nxtl[i] = upper_bound(a + 1, a + n + 1, a[i] + 2 * mid - 1) - a - 1;
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= q; j++) {
dp[i][j] = inf;
}
}
dp[0][0] = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= q; j++) {
if (dp[i][j] > p) continue;
int next = nxts[i + 1];
dp[next][j] = min(dp[next][j], dp[i][j] + 1);
if (j + 1 <= q) {
next = nxtl[i + 1];
dp[next][j + 1] = min(dp[next][j + 1], dp[i][j]);
}
}
}
bool ok = 0;
for (int j = 0; j <= q; j++) {
if (dp[n][j] <= p) {
ok = 1;
break;
}
}
if (ok) {
best = mid;
r = mid - 1;
} else l = mid + 1;
}
cout << best << endl;
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(0);
int T = 1;
// cin >> T;
while (T--) _();
}