#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
bool minimize(T& a, const T& b) {
if (b < a) {a = b; return true;}
return false;
}
const int N = 4e5 + 5;
// Bài toán 1: Chọn các chai rượu sao cho tổng lớn nhất và không được chọn k chai liên tiếp nhau
// Bài toán 2: Chọn bỏ đi các chai rượu sao cho tổng nhỏ nhất và chỉ số của 2 chai liên tiếp được chọn cách nhau không quá k (<= k)
// *Hướng giải 1:
// - Bài toán 1 chính là bài toán được phát biểu trong đề bài, vẫn có cách giải bằng dp nhưng công thức dp phức tạp hơn
// - Gọi dp[i] = Tổng lớn nhất của các chai rượu được chọn khi xét đến chai rượu thứ i và thoả mãn điều kiện
// - dp[i] = min{dp[j] + pref[i] - pref[j + 1]} (với j thuộc đoạn [i - k, i - 1])
// - biến đổi lại ta có dp[i] = min{dp[j] - pref[j + 1]} + pref[i]
// - Vậy từ đây với mỗi i ta cần tìm dp[j] - pref[j + 1] nhỏ nhất với j thuộc đoạn [i - k, i - 1]
// => Tối ưu bằng Deque/Segment Tree, độ phức tạp O(n)/O(nlogn), nhưng phần truy vết sẽ hơi vất vả một chút
// *Hướng giải 2:
// - Nhận xét: Từ đáp án có được ở bài toán 2 ta có thể suy ra được đáp án của bài toán 1 (và ngược lại)
// Hay nói cách khác thay vì đi tìm các chai rượu được chọn thì ta có thể đi tìm các chai rượu bị bỏ đi
// - Gọi dp[i] = Tổng nhỏ nhất của các chai rượu được chọn để bỏ đi khi xét đến chai rượu thứ i, thoả mãn điều kiện và chai thứ i chắc chắn được chọn
// - dp[i] = min{dp[j]} + a[i] (với j thuộc đoạn [i - k, i - 1])
// => Tối ưu bằng Deque/Segment Tree, độ phức tạp O(n)/O(nlogn)
int n, k;
int a[N];
ll dp[N];
int p[N]; // p[i] = vị trí của chai rượu trước đó được chọn nếu chọn chai thứ i
bool removed[N]; // removed[i] = 0/1: chai thứ i có được chọn để bỏ đi hay không
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k;
ll sum = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
}
for (int i = 0; i <= n; i++) dp[i] = LINF;
dp[0] = 0;
// for (int i = 1; i <= n; i++) {
// for (int j = max(0, i - k); j <= i - 1; j++) {
// if (minimize(dp[i], dp[j] + a[i])) {
// p[i] = j;
// }
// }
// } O(n * k)
deque<int> dq;
for (int i = 1; i <= n; i++) {
while (!dq.empty() && dp[dq.back()] > dp[i - 1]) dq.pop_back();
dq.push_back(i - 1);
if (dq.front() == i - k - 1) dq.pop_front();
dp[i] = dp[dq.front()] + a[i];
p[i] = dq.front();
} // O(n)
ll ans = LINF;
int last = 0;
for (int i = max(0, n - k + 1); i <= n; i++) {
if (minimize(ans, dp[i])) {
last = i;
}
}
int cnt = 0;
while (true) {
if (last == 0) break;
removed[last] = true;
cnt++;
last = p[last];
}
cnt = n - cnt;
ans = sum - ans;
cout << cnt << ' ' << ans << '\n';
for (int i = 1; i <= n; i++) {
if (removed[i]) continue;
cout << i << ' ';
}
}