#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; // using mint = modint1000000007; template using vec = vector; template using pa = pair; template using mipq = priority_queue, greater>; #define REP(_1, _2, _3, _4, name, ...) name #define REP1(i, n) for (auto i = decay_t{}; (i) < (n); ++(i)) #define REP2(i, l, r) for (auto i = (l); (i) < (r); ++(i)) #define REP3(i, l, r, d) for (auto i = (l); (i) < (r); i += (d)) #define rep(...) REP(__VA_ARGS__, REP3, REP2, REP1)(__VA_ARGS__) #define rrep(i, r, l) for (int i = (r); i >= (l); --i) template bool chmax(T &a, const T &b) { return (a < b ? a = b, true : false); } template bool chmin(T &a, const T &b) { return (a > b ? a = b, true : false); } constexpr int INF = 1 << 30; constexpr ll LINF = 1LL << 60; constexpr int mov[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; void solve(); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); int T = 1; // cin >> T; while (T--) solve(); } // h >= x が達成可能?というのは // k+1 個に分解して、サイズx以上のピースを2つ作れる?ということ // iから続けてx以上にするための最小幅、はまあしゃくとりでぜんぶわかる // 1つ目の切断位置を決め打ちすればまあできるのか... // 実装でバグらせそー void solve() { int N, L, K; cin >> N >> L >> K; vec A(N + 2); rep(i, N) cin >> A[i + 1]; A[N + 1] = L; int l = 1, r = L; while (r - l > 1) { int m = (l + r) / 2; vec nxt(N + 1, INF), width(N + 1, INF); int j = 0; rep(i, N + 1) { while (j < N + 2 && A[j] - A[i] < m) j++; if (j < N + 2) nxt[i] = j, width[i] = j - i; } vec cum(N + 2, INF); rrep(i, N, 0) cum[i] = min(cum[i + 1], width[i]); bool ok = false; rep(i, N + 1) { if (N + 1 + 2 - width[i] - cum[nxt[i]] >= K + 1) { l = m; ok = true; break; } } if (!ok) { r = m; } } cout << l << '\n'; }