import bisect N,L = map(int, input().split()) K = int(input()) a = [0]+list(map(int, input().split())) + [L] ##長さx以上の区間を2つ以上とるとき、最高でいくつの区間をとれるか def check(x): #dp[j][i]...長さx以上の区間をj個以上取っていることを保証し、今i番目の切れ目に着目しているときに最大でこれまで何個の区間をとれたか? dp = [[-1 for i in range(N+2)] for j in range(4)] dp[0][0] = 0 for j in range(3): for i in range(N+1): if dp[j][i] == -1: continue #すぐ次の区間をとる dp[j][i+1] = max(dp[j][i+1], dp[j][i]+1) #x以上になるまで区間を飛ばす idx = bisect.bisect_left(a, a[i]+x) if idx >= len(a): continue dp[j+1][idx] = max(dp[j+1][idx], dp[j][i]+1) # print(dp) return dp[2][N+1] >= K+1 ng = 1 ok = L+1 while ok-ng > 1: mid = (ok+ng)//2 if check(mid): ng = mid else: ok = mid print(ng) # # for i in range(1,L+2): # # print(check(i)) # print(check(5))