#include <bits/stdc++.h>
using namespace std;
template <class c>
struct rge {
  c b, e;
};
template <class c>
rge<c> range(c i, c j) {
  return {i, j};
}
struct printer {
  ~printer() { cerr << endl; }
  template <class c>
  printer &operator,(c x) {
    cerr << boolalpha << x;
    return *this;
  }
  printer &operator,(string x) {
    cerr << x;
    return *this;
  }
  template <class c, class d>
  printer &operator,(pair<c, d> x) {
    return *this, "(", x.first, ", ", x.second, ")";
  }
  template <class... d, template <class...> class c>
  printer &operator,(c<d...> x) {
    return *this, range(begin(x), end(x));
  }
  template <class c>
  printer &operator,(rge<c> x) {
    *this, "[";
    for (auto it = x.b; it != x.e; ++it) *this, (it == x.b ? "" : ", "), *it;
    return *this, "]";
  }
};
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int my_rand(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); }
const int inf = 1e8;
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  vector<int> v(n);
  for (int i = 0; i < n; i++) cin >> v[i];
  string s;
  for (int x : v) {
    if (x)
      s.push_back('1');
    else
      s.push_back('0');
  }
  int ones = 0, zeros = 0;
  for (char ch : s) {
    if (ch == '1')
      ones++;
    else
      zeros++;
  }
  if (ones == 0 or zeros == 0) {
    for (int i = 0; i <= n * (n - 1) / 2; i++) {
      cout << 0 << " ";
    }
    cout << endl;
    return 0;
  }
  vector<vector<vector<int>>> pre(
      zeros + 1, vector<vector<int>>(ones + 1, vector<int>(2)));
  for (int i = 0; i <= zeros; i++) {
    for (int j = 0; j <= ones; j++) {
      string new_s;
      int o = 0, z = 0;
      for (char ch : s) {
        if (ch == '0') {
          z++;
          if (z > i) new_s.push_back(ch);
        } else {
          o++;
          if (o > j) new_s.push_back(ch);
        }
      }
      int first_one = -1, first_zero = -1;
      for (int k = (int)new_s.size() - 1; k >= 0; k--) {
        if (new_s[k] == '0')
          first_zero = k;
        else
          first_one = k;
      }
      if (first_one != -1)
        pre[i][j][1] = first_one;
      else
        pre[i][j][1] = inf;
      if (first_zero != -1)
        pre[i][j][0] = first_zero;
      else
        pre[i][j][0] = inf;
    }
  }
  int max_moves = n * (n - 1) / 2;
  vector<vector<vector<int>>> dp_zero(
      zeros + 1, vector<vector<int>>(ones + 1, vector<int>(max_moves + 1)));
  vector<vector<vector<int>>> dp_one(
      zeros + 1, vector<vector<int>>(ones + 1, vector<int>(max_moves + 1)));
  for (int i = zeros; i >= 0; i--) {
    for (int j = ones; j >= 0; j--) {
      for (int remaining_moves = 0; remaining_moves <= max_moves;
           remaining_moves++) {
        dp_zero[i][j][remaining_moves] = inf;
        int cur_moves = 0;
        for (int k = 1; k <= zeros - i; k++) {
          int &res = dp_zero[i][j][remaining_moves];
          if (remaining_moves >= cur_moves + pre[i + k - 1][j][0]) {
            cur_moves += pre[i + k - 1][j][0];
            res = min(res, k * (k - 1) / 2 +
                               dp_one[i + k][j][remaining_moves - cur_moves]);
          } else
            break;
        }
        cur_moves = 0;
        dp_one[i][j][remaining_moves] = inf;
        for (int k = 1; k <= ones - j; k++) {
          int &res = dp_one[i][j][remaining_moves];
          if (remaining_moves >= cur_moves + pre[i][j + k - 1][1]) {
            cur_moves += pre[i][j + k - 1][1];
            res = min(res, dp_zero[i][j + k][remaining_moves - cur_moves]);
          } else
            break;
        }
        if (i == zeros && j == ones) {
          dp_one[i][j][remaining_moves] = 0;
          dp_zero[i][j][remaining_moves] = 0;
          continue;
        }
        if (i == zeros) {
          dp_zero[i][j][remaining_moves] = inf;
        }
        if (j == ones) {
          dp_one[i][j][remaining_moves] = inf;
        }
      }
    }
  }
  vector<int> res(max_moves + 1);
  int best = zeros * (zeros - 1) / 2;
  cerr << "LINE " << 143 << " >> ", printer(), "[", "zeros", ": ", (zeros),
      "] ", "[", "ones", ": ", (ones), "] ";
  for (int k = 0; k <= max_moves; k++) {
    res[k] = best - min(dp_one[0][0][k], dp_zero[0][0][k]);
  }
  for (int x : res) cout << x << " ";
}
