// Code generated by Gottani; see https://github.com/ktateish/gottani/. DO NOT EDIT.
package main
import (
"bufio"
"fmt"
"math"
"os"
"sort"
"strconv"
)
//line github.com/Warashi/go-atcoder/lib/min.go:5
func Min(is []int64) int64 {
var m int64 = math.MaxInt64
for _, i := range is {
if i < m {
m = i
}
}
return m
}
//line main.go:13
func can(L, K, min, score int64, ls []int64) bool {
if score < min {
return false
}
if score*(K+1) > L {
return false
}
var sum, piece int64
for _, l := range ls {
sum += l
if sum >= score {
piece++
sum = 0
}
}
return piece >= K+1
}
func split(L int64, A []int64) []int64 {
var l int64
r := make([]int64, 0, len(A)+1)
for _, a := range A {
r = append(r, a-l)
l = a
}
r = append(r, L-A[len(A)-1])
return r
}
func solve(N int64, L int64, K int64, A []int64) {
ls := split(L, A)
min := Min(ls)
fmt.Println(sort.Search(int(L), func(score int) bool { return !can(L, K, min, int64(score), ls) }) - 1)
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
const initialBufSize = 4096
const maxBufSize = 1000000
scanner.Buffer(make([]byte, initialBufSize), maxBufSize)
scanner.Split(bufio.ScanWords)
var N int64
scanner.Scan()
N, _ = strconv.ParseInt(scanner.Text(), 10, 64)
var L int64
scanner.Scan()
L, _ = strconv.ParseInt(scanner.Text(), 10, 64)
var K int64
scanner.Scan()
K, _ = strconv.ParseInt(scanner.Text(), 10, 64)
A := make([]int64, N)
for i := int64(0); i < N; i++ {
scanner.Scan()
A[i], _ = strconv.ParseInt(scanner.Text(), 10, 64)
}
solve(N, L, K, A)
}