#include <bits/stdc++.h>
using int64 = long long;
using uchar = unsigned char;
constexpr int mxdg(524288);
constexpr int maxn(200000);
const double pi(acos(-1.));
template <class _Tp>
inline void swap(_Tp &x, _Tp &y) {
  _Tp z = x;
  x = y;
  y = z;
}
inline int calcpw2(const int &n) {
  int t = 1;
  for (; t < n; t <<= 1)
    ;
  return t;
}
namespace IOManager {
constexpr int FILESZ(131072);
char buf[FILESZ];
const char *ibuf(buf), *tbuf(buf);
struct IOManager {
  inline char gc() {
    return (ibuf == tbuf) &&
                   (tbuf = (ibuf = buf) + fread(buf, 1, FILESZ, stdin),
                    ibuf == tbuf)
               ? EOF
               : *ibuf++;
  }
  template <class _Tp>
  inline operator _Tp() {
    _Tp s = 0;
    char c = gc(), w = 0;
    for (; c < 48; c = gc()) c == 45 && (w = 1);
    for (; 47 < c; c = gc()) s = s * 10 + c - 48;
    return w ? -s : s;
  }
};
}  // namespace IOManager
IOManager::IOManager io;
template <class _Tp>
struct Complex {
  _Tp r, i;
  Complex(const _Tp &ir = (_Tp)0, const _Tp &ii = (_Tp)0) : r(ir), i(ii) {}
  inline Complex operator+(const Complex &rhs) const {
    return Complex(r + rhs.r, i + rhs.i);
  }
  inline Complex operator-(const Complex &rhs) const {
    return Complex(r - rhs.r, i - rhs.i);
  }
  inline Complex operator*(const Complex &rhs) const {
    return Complex(r * rhs.r - i * rhs.i, r * rhs.i + i * rhs.r);
  }
  inline Complex &operator+=(const Complex &rhs) {
    return r += rhs.r, i += rhs.i, *this;
  }
  inline Complex &operator-=(const Complex &rhs) {
    return r -= rhs.r, i -= rhs.i, *this;
  }
  inline Complex &operator*=(const Complex &rhs) { return *this = *this * rhs; }
  inline Complex conj() const { return Complex(r, -i); }
};
using cpx = Complex<double>;
void DFT(cpx *const &A, const int &deg) {
  for (int i = 0, j = 0; i != deg; ++i) {
    if (i > j) swap(A[i], A[j]);
    for (int k = deg >> 1; (j ^= k) < k; k >>= 1)
      ;
  }
  cpx *const td = A + deg;
  for (int l = 1, tp = mxdg >> 1; l != deg; l += l, tp >>= 1)
    for (cpx *i = A, w, wn(cos(pi / l), sin(pi / l)), z; i != td; i += l + l)
      for (int j = (w = cpx(1, 0), 0); j != l; ++j, w *= wn)
        z = i[j + l] * w, i[j + l] = i[j] - z, i[j] += z;
}
void IDFT(cpx *const &A, const int &deg) {
  for (int i = 0, j = 0; i != deg; ++i) {
    if (i > j) swap(A[i], A[j]);
    for (int k = deg >> 1; (j ^= k) < k; k >>= 1)
      ;
  }
  cpx *const td = A + deg;
  for (int l = 1, tp = mxdg >> 1; l != deg; l += l, tp >>= 1)
    for (cpx *i = A, w, wn(cos(pi / l), -sin(pi / l)), z; i != td; i += l + l)
      for (int j = (w = cpx(1, 0), 0); j != l; ++j, w *= wn)
        z = i[j + l] * w, i[j + l] = i[j] - z, i[j] += z;
  for (int i = 0; i != deg; ++i) A[i].r /= deg;
}
cpx f[mxdg], g[mxdg];
int main() {
  const int n = io, x = io;
  int cnt = 0;
  for (int i = 1; i <= n; ++i) f[cnt].r += 1, cnt += ((int)io < x);
  f[cnt].r += 1;
  const int tl(cnt), deg(calcpw2(((tl << 1) + 1)));
  for (int i = 0; i <= tl; ++i) g[i].r = f[tl - i].r;
  DFT(f, deg);
  DFT(g, deg);
  for (int i = 0; i != deg; ++i) f[i] *= g[i];
  IDFT(f, deg);
  printf("%lld", ((int64)(f[tl].r + .5) - n - 1) >> 1);
  for (int i = tl - 1; ~i; --i) printf(" %lld", (int64)(f[i].r + .5));
  for (int i = n - tl; i; --i) printf(" 0");
  return 0;
}
