Problem: A lighthouse keeper Peter commands an army of n battle lemmings. He ordered his army to stand in a line and numbered the lemmings from 1 to n from left to right. Some of the lemmings hold shields. Each lemming cannot hold more than one shield.

The more protected Peter's army is, the better. To calculate the protection of the army, he finds the number of protected pairs of lemmings, that is such pairs that both lemmings in the pair don't hold a shield, but there is a lemming with a shield between them.

Now it's time to prepare for defence and increase the protection of the army. To do this, Peter can give orders. He chooses a lemming with a shield and gives him one of the two orders: 

  * give the shield to the left neighbor if it exists and doesn't have a shield; 
  * give the shield to the right neighbor if it exists and doesn't have a shield. 



In one second Peter can give exactly one order.

It's not clear how much time Peter has before the defence. So he decided to determine the maximal value of army protection for each k from 0 to \frac{n(n-1)}2, if he gives no more that k orders. Help Peter to calculate it!

Input

First line contains a single integer n (1 ≤ n ≤ 80), the number of lemmings in Peter's army.

Second line contains n integers a_i (0 ≤ a_i ≤ 1). If a_i = 1, then the i-th lemming has a shield, otherwise a_i = 0.

Output

Print \frac{n(n-1)}2 + 1 numbers, the greatest possible protection after no more than 0, 1, ..., \frac{n(n-1)}2 orders.

Examples

Input


5
1 0 0 0 1


Output


0 2 3 3 3 3 3 3 3 3 3 


Input


12
0 0 0 0 1 1 1 1 0 1 1 0


Output


9 12 13 14 14 14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 

Note

Consider the first example.

The protection is initially equal to zero, because for each pair of lemmings without shields there is no lemmings with shield.

In one second Peter can order the first lemming give his shield to the right neighbor. In this case, the protection is two, as there are two protected pairs of lemmings, (1, 3) and (1, 4).

In two seconds Peter can act in the following way. First, he orders the fifth lemming to give a shield to the left neighbor. Then, he orders the first lemming to give a shield to the right neighbor. In this case Peter has three protected pairs of lemmings — (1, 3), (1, 5) and (3, 5).

You can make sure that it's impossible to give orders in such a way that the protection becomes greater than three.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void ckmax(T& x, T y) {
  x = (y > x ? y : x);
}
template <typename T>
inline void ckmin(T& x, T y) {
  x = (y < x ? y : x);
}
const int MAXN = 80, MAXOP = MAXN * (MAXN - 1) / 2;
const int INF = 0x3f3f3f3f;
int n, a[MAXN + 5], cnt[2], pos[MAXN + 5];
int total, max_op;
int dp[MAXOP + 5][MAXN + 5][MAXN + 5];
struct Queue {
  int a[MAXN + 5];
  int ql, qr;
  int size() { return qr - ql + 1; }
  bool empty() { return ql > qr; }
  int front() { return a[ql]; }
  int back() { return a[qr]; }
  int back2() { return a[qr - 1]; }
  void push_back(int e) { a[++qr] = e; }
  void pop_back() { --qr; }
  void init() {
    ql = 1;
    qr = 0;
  }
} que[MAXOP + 5][MAXN + 5];
int ans[MAXOP + 5];
int calc(int len) { return len * (len - 1) / 2; }
int calc2(int len) { return len * (len - 1); }
int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    cnt[a[i]]++;
    if (a[i] == 1) {
      pos[cnt[1]] = i;
    }
  }
  total = calc(cnt[0]);
  max_op = calc(n);
  if (!cnt[1]) {
    for (int i = 0; i <= max_op; ++i) cout << 0 << " ";
    cout << endl;
    return 0;
  }
  memset(dp, 0x3f, sizeof(dp));
  for (int j = 0; j <= max_op; ++j) {
    for (int k = 1; k <= cnt[1]; ++k) {
      que[j][k].init();
    }
  }
  for (int i = 1; i <= n; ++i) {
    dp[abs(pos[1] - i)][1][i] = calc2(i - 1);
    while (
        que[abs(pos[1] - i)][1].size() >= 2 &&
        ((dp[abs(pos[1] - i)][1][(que[abs(pos[1] - i)][1].back())] +
          (que[abs(pos[1] - i)][1].back()) * (que[abs(pos[1] - i)][1].back()) +
          3 * (que[abs(pos[1] - i)][1].back())) -
         (dp[abs(pos[1] - i)][1][(que[abs(pos[1] - i)][1].back2())] +
          (que[abs(pos[1] - i)][1].back2()) *
              (que[abs(pos[1] - i)][1].back2()) +
          3 * (que[abs(pos[1] - i)][1].back2()))) *
                (i - que[abs(pos[1] - i)][1].back()) >
            ((dp[abs(pos[1] - i)][1][(i)] + (i) * (i) + 3 * (i)) -
             (dp[abs(pos[1] - i)][1][(que[abs(pos[1] - i)][1].back())] +
              (que[abs(pos[1] - i)][1].back()) *
                  (que[abs(pos[1] - i)][1].back()) +
              3 * (que[abs(pos[1] - i)][1].back()))) *
                (que[abs(pos[1] - i)][1].back() -
                 que[abs(pos[1] - i)][1].back2()))
      que[abs(pos[1] - i)][1].pop_back();
    que[abs(pos[1] - i)][1].push_back(i);
  }
  for (int j = 0; j <= max_op; ++j) {
    for (int k = 2; k <= cnt[1]; ++k) {
      for (int i = k; i <= n - (cnt[1] - k); ++i) {
        if (j < abs(pos[k] - i)) continue;
        int last_j = j - abs(pos[k] - i);
        if (que[last_j][k - 1].empty()) continue;
        if (que[last_j][k - 1].front() >= i) continue;
        int l = que[last_j][k - 1].ql;
        int r = que[last_j][k - 1].qr;
        while (l < r) {
          int mid = (l + r + 1) >> 1;
          if (que[last_j][k - 1].a[mid] < i) {
            l = mid;
          } else {
            r = mid - 1;
          }
        }
        l = que[last_j][k - 1].ql;
        while (l < r) {
          int mid = (l + r) >> 1;
          int p1 = que[last_j][k - 1].a[mid],
              p2 = que[last_j][k - 1].a[mid + 1];
          if ((dp[last_j][k - 1][(p2)] + (p2) * (p2) + 3 * (p2)) -
                  (dp[last_j][k - 1][(p1)] + (p1) * (p1) + 3 * (p1)) >
              2 * i * (p2 - p1)) {
            r = mid;
          } else {
            l = mid + 1;
          }
        }
        ckmin(dp[j][k][i], dp[last_j][k - 1][que[last_j][k - 1].a[l]] +
                               calc2(i - que[last_j][k - 1].a[l] - 1));
        while (que[j][k].size() >= 2 &&
               ((dp[j][k][(que[j][k].back())] +
                 (que[j][k].back()) * (que[j][k].back()) +
                 3 * (que[j][k].back())) -
                (dp[j][k][(que[j][k].back2())] +
                 (que[j][k].back2()) * (que[j][k].back2()) +
                 3 * (que[j][k].back2()))) *
                       (i - que[j][k].back()) >
                   ((dp[j][k][(i)] + (i) * (i) + 3 * (i)) -
                    (dp[j][k][(que[j][k].back())] +
                     (que[j][k].back()) * (que[j][k].back()) +
                     3 * (que[j][k].back()))) *
                       (que[j][k].back() - que[j][k].back2()))
          que[j][k].pop_back();
        que[j][k].push_back(i);
      }
    }
  }
  int res = total;
  for (int j = 0; j <= max_op; ++j) {
    for (int i = cnt[1]; i <= n; ++i)
      if (dp[j][cnt[1]][i] != INF) {
        ckmin(res, (dp[j][cnt[1]][i] + calc2(n - i)) / 2);
      }
    cout << total - res << " ";
  }
  cout << endl;
  return 0;
}