#include using namespace std; using ll = long long; constexpr ll INF = (1LL << 62); template int bsearch(int low, int high, F pred) { assert(pred(low)); int lo = low; int hi = high; int res = low; while (lo <= hi) { int m = (lo + hi) / 2; if (pred(m)) { res = max(res, m); lo = m + 1; } else { hi = m - 1; } } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, L; cin >> N >> L; int K; cin >> K; vector A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } vector cakes; int prev = 0; for (int a : A) { cakes.push_back(a - prev); prev = a; } cakes.push_back(L - prev); int sz = (int)cakes.size(); vector acc(sz); partial_sum(cakes.begin(), cakes.end(), acc.begin()); auto can = [&](int m) -> bool { vector> dp(sz + 1, vector(3, -INF)); dp[0][0] = 0; for (int i = 0; i < sz; i++) { for (int j = 0; j < 3; j++) { dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + 1); } ll x = (i > 0 ? acc[i - 1] : 0); int p = lower_bound(acc.begin(), acc.end(), x + m) - acc.begin(); if (p < sz) { for (int j = 0; j < 2; j++) { dp[p + 1][j + 1] = max(dp[p + 1][j + 1], dp[i][j] + 1); } } } return dp[sz][2] > K; }; int ans = bsearch(1, L, can); cout << ans << '\n'; return 0; }