n, l = read_line.split.map(&.to_i) k = read_line.to_i a = [0] + read_line.split.map(&.to_i) + [l] lo = 1 hi = l while hi - lo > 1 mid = (lo + hi) // 2 if ok(mid, a, l, k) lo = mid else hi = mid end end puts lo def ok(len, a, l, k) n = a.size bc = Array.new(n, n + 1) right = n - 1 left = n - 1 while a[right] - a[left] < len left -= 1 end while true bc[left] = right - left - 1 break if left == 0 left -= 1 while a[right - 1] - a[left] >= len right -= 1 end end (n - 2).downto(0) do |i| bc[i] = {bc[i], bc[i + 1]}.min end puts [len, bc] left = 0 right = 1 while a[right] - a[left] < len right += 1 end while right < n - 1 fc = right - left - 1 if fc + bc[right + 1] <= (n - 2) - k return true end right += 1 while a[right] - a[left + 1] >= len left += 1 end end return false end