from itertools import accumulate, pairwise from bisect import bisect_left def bsearch(low: int, high: int, pred) -> int: assert pred(low) lo = low hi = high res = low while lo <= hi: m = (lo + hi) // 2 if pred(m): res = max(res, m) lo = m + 1 else: hi = m - 1 return res INF = 1 << 62 N, L = map(int, input().split()) K = int(input()) A = list(map(int, input().split())) cakes = [] for a, b in pairwise([0] + A + [L]): cakes.append(b-a) acc = list(accumulate(cakes)) # 2番目に大きな値を m 以上にできるか def can(m: int) -> bool: sz = len(cakes) dp = [[-INF] * 3 for _ in range(sz+1)] dp[0][0] = 0 for i in range(sz): for j in range(3): dp[i+1][j] = max(dp[i+1][j], dp[i][j] + 1) # i 番目から総和が m を超える最小の p x = acc[i-1] if i > 0 else 0 p = bisect_left(acc, x + m) if p < sz: for j in range(3-1): dp[p+1][j+1] = max(dp[p+1][j+1], dp[i][j] + 1) return dp[sz][2] > K ans = bsearch(1, L, can) print(ans)