#include #include namespace po167{ template struct Doubling_op{ int n; int depth; std::vector> index; std::vector> val; Doubling_op(std::vector p, std::vector v, long long lim = (1ll << 60) - 1){ n = p.size(); for (auto x : p) assert(0 <= x && x < n); assert(n == (int)v.size()); depth = 1; while ((1ll << depth) <= lim) depth++; index.resize(depth); val.resize(depth); index[0] = p; val[0] = v; for (int i = 1; i < depth; i++){ index[i].resize(n); val[i].resize(n); for (int j = 0; j < n; j++){ int tmp = index[i - 1][j]; index[i][j] = index[i - 1][tmp]; val[i][j] = op(val[i - 1][j], val[i - 1][tmp]); } } } std::pair query(int start_ind, T start_val, long long times){ assert(0 <= start_ind && start_ind < n); assert(0 <= times && times < (1ll << depth)); int i = 0; while (times){ if (times & 1){ start_val = op(start_val, val[i][start_ind]); start_ind = index[i][start_ind]; } i++; times >>= 1; } return std::make_pair(start_ind, start_val); } }; struct Doubling{ int n; int depth; std::vector> index; Doubling(std::vector p, long long lim = (1ll << 60) - 1){ n = p.size(); for (auto x : p) assert(0 <= x && x < n); depth = 1; while ((1ll << depth) <= lim) depth++; index.resize(depth); index[0] = p; for (int i = 1; i < depth; i++){ index[i].resize(n); for (int j = 0; j < n; j++){ index[i][j] = index[i - 1][index[i - 1][j]]; } } } int query(int ind, long long times){ assert(0 <= ind && ind < n); assert(0 <= times && times < (1ll << depth)); int i = 0; while (times){ if (times & 1) ind = index[i][ind]; i++; times >>= 1; } return ind; } }; } int op(int a, int b){ return std::min(a, b); } #include int main(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, K; std::cin >> N >> K; std::vector A(N); for (int i = 0; i < N; i++) std::cin >> A[i]; std::vector S(N * 2 + 1); for (int i = 0; i < N; i++){ S[i + 1] = S[i] + A[i]; } for (int i = 0; i < N; i++){ S[i + 1 + N] = S[i + 1] + S[N]; } long long l = 0, r = (1ll << 50); auto f = [&](long long m) -> int { std::vector v(N * 2 + 1); for (int i = 0; i < N * 2; i++){ while (v[i] != N * 2 && S[v[i]] - S[i] < m) v[i]++; v[i + 1] = v[i]; } v[N * 2] = N * 2; po167::Doubling D(v, K); int ok = 0; for (int i = 0; i < N; i++){ if (D.query(i, K) <= N + i) ok++; } return ok; }; while (r - l > 1){ long long m = (l + r) / 2; if (f(m)) l = m; else r = m; } std::cout << l << "\n"; }