#include<bits/stdc++.h>
#define int long long
#define valt long double
using namespace std;
int n, k, c, sum[100004] = {0}, f[100004] = {0}, q[100004], head = 1, tail = 1, tmp[100004], fa[100005][205];
int sqr(int a) {
return a * a;
}
valt Y(int j) {
return tmp[j] - sqr(sum[j]);
}
valt X(int j) {
return sum[j];
}
valt K(int i) {
return -sum[i];
}
valt slope(int j1, int j2) {
if (X(j1) == X(j2)) {
if (Y(j1) < Y(j2)) return LONG_LONG_MAX;
if (Y(j1) > Y(j2)) return LONG_LONG_MIN;
return 0;
}
return (Y(j2) - Y(j1)) / (X(j2) - X(j1));
}
signed main() {
memset(f, 0, sizeof(f));
scanf("%lld%lld", &n, &k);
for (int i = 1; i <= n; ++i) scanf("%lld", &c), sum[i] = sum[i - 1] + c;
for (int s = 0; s <= k; ++s) {
head = tail = 1; q[0] = q[1] = q[2] = 0;
for (int i = 1; i <= n; ++i) {
tmp[i] = f[i], f[i] = 0;
while (head < tail && slope(q[head], q[head + 1]) > K(i)) ++head;
int j = q[head];
fa[i][s] = j;
f[i] = tmp[j] + sum[j] * (sum[i] - sum[j]);
while (head < tail && slope(q[tail - 1], q[tail]) < slope(q[tail], i)) --tail;
q[++tail] = i;
}
}
printf("%lld\n", f[n]);
for (int x = fa[n][k]; k; x = fa[x][--k]) printf("%d ", x);
return 0;
}
斜优 WA 0pts 求遽铑帮忙