#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
const int N = 5e5 + 50;
int n, k;
int a[N], tree[4*N], left_idx[N], right_idx[N], left_fa[N], right_fa[N];
void build(int rt, int l, int r) {
if (l == r) {
tree[rt] = a[l];
return;
}
int mid = (l + r) >> 1;
build(rt * 2, l, mid);
build(rt * 2 + 1, mid + 1, r);
tree[rt] = min(tree[rt * 2], tree[rt * 2 + 1]);
}
pair<int, int> query(int rt, int l, int r) {
if (l == r ){
return make_pair(tree[rt], l);
}
int mid = (l + r) >> 1;
pair<int, int> ans(0, 0);
if (tree[rt * 2] <= tree[rt * 2 + 1]) {
ans = query(rt * 2, l, mid);
}else {
ans = query(rt * 2 + 1, r, mid);
}
return ans;
}
void modify(int rt, int l, int r, int idx, int val) {
if (l == r) {
tree[rt] += val;
return;
}
int mid = (l + r) >> 1;
if (idx <= mid) {
modify(rt * 2, l, mid, idx, val);
} else {
modify(rt * 2 + 1, mid + 1, r, idx, val);
}
tree[rt] = min(tree[rt * 2], tree[rt * 2 + 1]);
}
int find(int f[], int x) {
if (f[x] != x) {
f[x] = find(f, f[x]);
}
return f[x];
}
void work() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
for (int i = 1; i <= n; i++) {
left_idx[i] = i;
right_idx[i] = i;
left_fa[i] = i;
right_fa[i] = i;
}
while (k--) {
pair<int, int> ans = query(1, 1, n);
int idx = ans.second;
cout<<ans.first<<ans.second<<endl;
int left = find(left_fa, idx - 1);
find(left_idx, idx - 1);
int right = find(right_fa, idx + 1);
find(right_idx, idx + 1);
left_fa[idx] = left;
right_fa[idx] = right;
left_idx[idx] = left;
right_idx[idx] = right;
modify(1, 1, n, idx, 1e18);
modify(1, 1, n, left, ans.first);
modify(1, 1, n, right, ans.first);
a[left] += ans.first;
a[right] += ans.first;
for (int i = 1; i <= n; i++) {
if (left_fa[i] == i) {
cout << a[i] << " ";
}
} cout<<endl;
}
for (int i = 1; i <= n; i++) {
if (left_fa[i] == i) {
cout << a[i] << " ";
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T = 1;
while (T--) {
work();
}
return 0;
}