#include <iostream>
#include <assert.h>
#include <algorithm>
#include <vector>
#define forn(i,n) for(int i=0;i<(int)n;++i)
#define forit(i,a,n) for(int i=a;i<=(int)n;++i)
#define DBG(a) cerr<<#a<<" = "<<(a)<<endl
#define DBGA(a) cerr<<#a<<" = "<<(a)<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)
#define ALL(v) v.begin(),v.end()
#define SZ(v) (int)v.size()
using namespace std;
template<typename T>
ostream &operator<<(ostream &os, vector<T> v){
os<<"[";
forn(i,SZ(v)){
if(i) os<<", ";
os<<v[i];
}
os<<"]";
return os;
}
typedef long long ll;
const ll INF = 1000000000000000000;
struct ST{
int n;
vector<ll> st;
ST(int m){
n = 1<<(32-__builtin_clz(m-1));
st.resize(2*n-1, INF);
}
int query(ll v){
int i = 0;
if(st[i]>v) return -1; // no hay valor valido
while(i<n-1){
if(st[2*i+2]<=v) i=2*i+2;
else i=2*i+1; // porque primero me aseguro
}
return i-n+1;
}
void update(int i, ll v){
i+=n-1;
st[i] = v;
while(i){
i = (i-1)/2;
st[i] = min(st[2*i+1],st[2*i+2]);
}
}
};
void solve(){
int n;
cin>>n;
vector<int> a(n);
for(int &x: a) cin>>x;
vector<ll> add(n+1);
forn(i,n) add[i+1] = add[i]+a[i];
vector<vector<ll>> dp(n+1,vector<ll>(n+1,INF));
forit(i,1,n) dp[1][i] = add[i]; // tablita aditiva fachera
forit(i,2,n){
ST rast(n+1);
for(int j=1;j<=n;++j){
int k = rast.query(-(add[n]-add[j]));
if(k == -1){
dp[i][j] = INF;
} else{
dp[i][j] = add[j]-add[k];
}
if(dp[i-1][j] != INF){
rast.update(j,dp[i-1][j]-(add[n]-add[j]));
}
}
}
//~ forit(i,1,n){
//~ forit(j,1,n){
//~ if(dp[i][j] == INF) cerr<<"--\t";
//~ else cerr<<dp[i][j]<<"\t";
//~ }
//~ cerr<<"\n";
//~ }
int ans = 0;
forit(i,1,n) if(dp[i][n] != INF) ans = i;
vector<ll> b;
int i=ans, j=n;
while(i){
ll sum = dp[i][j];
b.push_back(sum);
while(j>=1&&sum>0){
sum -= a[--j];
}
assert(!sum);
--i;
}
reverse(ALL(b));
cout<<ans<<"\n";
for(ll x: b) cout<<x<<" ";
cout<<"\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
#ifdef LOCAL
freopen("D.in", "r", stdin);
int tcs; cin>>tcs;
while(tcs--)
#endif
solve();
return 0;
}