#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
using ll = int;
using vl = __int128_t;
using ld = long double;
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
struct st {
vector<pair<ll, ll>> t;
st(ll n) {
t.assign(4 * n, {(ll)-1e18, (ll)-1});
}
void upd(ll v, ll l, ll r, ll i, ll x) {
if (l + 1 == r) {
t[v] = {x, l};
return;
}
ll md = (l + r) / 2;
if (i < md) upd(2 * v + 1, l, md, i, x);
else upd(2 * v + 2, md, r, i, x);
t[v] = max(t[2 * v + 1], t[2 * v + 2]);
}
pair<ll, ll> get(ll v, ll l, ll r, ll ql, ll qr) {
if (l >= qr || ql >= r) return {(ll)-1e18, (ll)-1};
if (l >= ql && r <= qr) return t[v];
ll md = (l + r) / 2;
return max(get(2 * v + 1, l, md, ql, qr), get(2 * v + 2, md, r, ql, qr));
}
};
void solve() {
ll n;
cin >> n;
vector<ll> a(n), pr = {0};
for (ll& x : a) cin >> x, pr.push_back(pr.back() + x);
vector<vector<ll>> dp(n, vector<ll>(n, -1e18)), p(n, vector<ll>(n));
vector<st> dst(n, st(n));
for (ll i = 0; i < n; i++) {
for (ll j = i; j > 0; j--) {
ll nd = pr[j] - pr[i + 1] + pr[j];
ll k = lower_bound(all(pr), nd) - pr.begin();
if (k > j - 1) continue;
auto [mx, opt] = dst[j - 1].get(0, 0, n, k, j);
dp[i][j] = mx + 1;
p[i][j] = opt;
dst[i].upd(0, 0, n, j, dp[i][j]);
}
dp[i][0] = 1;
p[i][0] = -1;
dst[i].upd(0, 0, n, 0, 1);
}
cout << *max_element(all(dp[n - 1])) << '\n';
vector<ll> res;
ll i = n - 1, j = max_element(all(dp[n - 1])) - dp[n - 1].begin();
while (j != -1) {
res.push_back(pr[i + 1] - pr[j]);
ll wi = i;
i = j - 1;
j = p[wi][j];
}
reverse(all(res));
for (ll x : res) cout << x << ' ';
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll t = 1;
// cin >> t;
while (t--) {
solve();
}
}