package main
import (
"bufio"
"fmt"
"os"
)
type MaxHeap struct {
data []int
}
func (h *MaxHeap) Push(v int) {
h.data = append(h.data, v)
h.up(len(h.data) - 1)
}
func (h *MaxHeap) Pop() int {
n := len(h.data) - 1
h.data[0], h.data[n] = h.data[n], h.data[0]
v := h.data[n]
h.data = h.data[:n]
h.down(0)
return v
}
func (h *MaxHeap) up(j int) {
for {
i := (j - 1) / 2
if i == j || h.data[i] >= h.data[j] {
break
}
h.data[i], h.data[j] = h.data[j], h.data[i]
j = i
}
}
func (h *MaxHeap) down(i0 int) {
i := i0
n := len(h.data)
for {
j1 := 2*i + 1
if j1 >= n || j1 < 0 {
break
}
j := j1
if j2 := j1 + 1; j2 < n && h.data[j2] > h.data[j1] {
j = j2
}
if h.data[i] >= h.data[j] {
break
}
h.data[i], h.data[j] = h.data[j], h.data[i]
i = j
}
}
func (h *MaxHeap) Clear() {
h.data = h.data[:0]
}
func (h *MaxHeap) Len() int {
return len(h.data)
}
func main() {
reader := bufio.NewReader(os.Stdin)
var n, k, x int
fmt.Fscan(reader, &n, &k, &x)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(reader, &a[i])
}
h := &MaxHeap{data: make([]int, 0, n)}
check := func(S int64) bool {
removed := 0
var sum int64 = 0
h.Clear()
for i := 0; i < n; i++ {
h.Push(a[i])
sum += int64(a[i])
for sum > S {
maxVal := h.Pop()
sum -= int64(maxVal)
removed++
}
if h.Len() == x {
h.Clear()
sum = 0
}
}
return removed <= k
}
var low, high int64 = 0, 100000000000000
ans := high
for low <= high {
mid := low + (high-low)/2
if check(mid) {
ans = mid
high = mid - 1
} else {
low = mid + 1
}
}
fmt.Println(ans)
}