import bisect n,m = map(int,input().split()) k = int(input()) A = [int(_) for _ in input().split()] A = [0] + A + [m] def check(num): S = [10**18] * (n+1) for i in range(n+1): left = i right = bisect.bisect_left(A,A[left] + num) if right == n+2: S[left] = 10**18 continue S[left] = right - left min_S = [10**18] * (n+1) min_S[-1] = S[-1] for i in range(n): min_S[-(i+2)] = min(min_S[-(i+1)],S[-(i+2)]) for i in range(n): if S[i] == 10**18 or i+S[i]+1 >= n+1: continue if (n + 1) - ( S[i] + min_S[i + S[i] + 1] ) >= k - 1: return True return False left = 0 right = 10**10 while left + 1 != right: mid = (left+right) // 2 if check(mid): left = mid else: right = mid print(left)