import sys import bisect def main(): N, K = map(int, sys.stdin.readline().split()) A = list(map(int, sys.stdin.readline().split())) sumA = sum(A) if K == 0: print(0) return if K == 1: print(sumA) return B = A + A S = [0] * (2 * N + 1) for i in range(2 * N): S[i+1] = S[i] + B[i] low = 1 high = sumA // K answer = 0 MAX_LOG = 20 while low <= high: mid = (low + high) // 2 next_pos = [0] * (2 * N) for i in range(2 * N): target = S[i] + mid j = bisect.bisect_left(S, target, i+1, min(2*N+1, i + N +1)) if j > 2 * N: j = 2 * N + 1 # unreachable next_pos[i] = j dp = [[0]*(2*N +2) for _ in range(MAX_LOG)] dp[0] = next_pos[:] + [2*N +1]*(2*N +2 - len(next_pos)) for k in range(1, MAX_LOG): for i in range(2*N): if dp[k-1][i] >= 2*N: dp[k][i] = 2*N +1 else: dp[k][i] = dp[k-1][dp[k-1][i]] ok = False for start in range(N): current = start cnt = 0 end = start + N for k in reversed(range(MAX_LOG)): if current >= end: break if dp[k][current] <= end: cnt += (1 << k) current = dp[k][current] if cnt >= K: ok = True break if ok: answer = mid low = mid + 1 else: high = mid -1 print(answer) if __name__ == "__main__": main()