#include <bits/stdc++.h>
using namespace std;
long long powr(long long a, long long b, long long mod) {
  long long x = 1 % mod;
  a %= mod;
  while (b) {
    if (b & 1) x = (x * a) % mod;
    a = (a * a) % mod;
    b >>= 1;
  }
  return x;
}
long long inv(long long a, long long mod) { return powr(a, mod - 2, mod); }
const long long maxn = 1e6 + 10;
void mul_naive(vector<long long>& a, vector<long long>& b) {
  vector<long long> c(a.size() + b.size() - 1);
  for (long long i = 0; i < a.size(); i++)
    for (long long j = 0; j < b.size(); j++) c[i + j] += a[i] * b[j];
  a = c;
}
class NTT {
  long long p, g, n, logn;

 public:
  NTT(long long P, long long G, long long LOGN) {
    p = P;
    long long g1 = G;
    logn = LOGN;
    n = (1 << LOGN);
    assert((p - 1) % n == 0);
    g = powr(g1, (p - 1) >> logn, p);
  }
  long long bitrevcopy(long long i) {
    long long ret = 0;
    for (long long j = 0; j < logn; j++)
      if (i & (1 << j)) ret |= (1 << (logn - 1 - j));
    return ret;
  }
  void fft(vector<long long>& a, bool invert) {
    long long mod = p;
    for (long long i = 0; i < n; i++) {
      long long br = bitrevcopy(i);
      if (i < br) swap(a[i], a[br]);
    }
    for (long long i = 1; i <= logn; i++) {
      long long mul = powr(g, 1 << (logn - i), p);
      if (invert) mul = inv(mul, p);
      long long add = (1 << i);
      for (long long k = 0; k < n; k += add) {
        long long w = 1;
        long long lim = (add >> 1);
        for (long long j = 0; j < lim; j++) {
          long long u = (w * a[k + j + lim]) % p, v = a[k + j];
          a[k + j] = u + v;
          if (a[k + j] >= p) a[k + j] -= p;
          a[k + j + lim] = v - u;
          if (a[k + j + lim] < 0) a[k + j + lim] += p;
          w = (w * mul) % p;
        }
      }
    }
    if (invert) {
      long long _inv = inv(n, p);
      for (long long i = 0; i < n; i++) {
        a[i] = (a[i] * _inv) % p;
      }
    }
  }
};
long long mulmod(long long a, long long b, long long mod) {
  if (a == 0 || b == 0) return 0;
  if (b <= 4e18 / a) return (a * b) % mod;
  long long b1 = b / 4, b2 = b - 4 * b1;
  return (a * b2 + 4 * mulmod(a, b1, mod)) % mod;
}
void NTT_mul(vector<long long>& a, vector<long long>& B) {
  vector<long long> b = B;
  long long p1 = 998244353, g1 = 3, p2 = 985661441, g2 = 3,
            inv1 = powr(p1, p2 - 2, p2), inv2 = powr(p2, p1 - 2, p1);
  long long mul1 = (p1 * inv1) % (p1 * p2), mul2 = (p2 * inv2) % (p1 * p2);
  long long _sz = a.size() + b.size() - 1;
  long long LOGN = 0;
  while ((1 << LOGN) < _sz) LOGN++;
  long long N = (1 << LOGN);
  a.resize(N);
  b.resize(N);
  vector<long long> a1 = a, b1 = b;
  NTT fft1 = NTT(p1, g1, LOGN);
  NTT fft2 = NTT(p2, g2, LOGN);
  fft1.fft(a, false);
  fft1.fft(b, false);
  fft2.fft(a1, false);
  fft2.fft(b1, false);
  for (long long i = 0; i < N; i++) {
    a[i] = (a[i] * b[i]) % p1;
    a1[i] = (a1[i] * b1[i]) % p2;
  }
  fft1.fft(a, true);
  fft2.fft(a1, true);
  long long md = p1 * p2;
  a.resize(_sz);
  for (long long i = 0; i < _sz; i++) {
    a[i] = (mulmod(mul1, a1[i], md) + mulmod(mul2, a[i], md)) % (md);
  }
}
double PI = 2.0 * acos(0.0);
void fft(vector<complex<double> >& a, bool invert) {
  long long n = (long long)a.size();
  for (long long i = 1, j = 0; i < n; ++i) {
    long long bit = n >> 1;
    for (; j >= bit; bit >>= 1) j -= bit;
    j += bit;
    if (i < j) swap(a[i], a[j]);
  }
  for (long long len = 2; len <= n; len <<= 1) {
    double ang = 2 * PI / len * (invert ? -1 : 1);
    complex<double> wlen(cos(ang), sin(ang));
    for (long long i = 0; i < n; i += len) {
      complex<double> w(1);
      for (long long j = 0; j < len / 2; ++j) {
        complex<double> u = a[i + j], v = a[i + j + len / 2] * w;
        a[i + j] = u + v;
        a[i + j + len / 2] = u - v;
        w *= wlen;
      }
    }
  }
  if (invert)
    for (long long i = 0; i < n; ++i) a[i] /= n;
}
void multiply(vector<long long>& a, vector<long long>& B) {
  vector<long long> b = B;
  vector<complex<double> > fa(a.begin(), a.end()), fb(b.begin(), b.end());
  long long n = 1;
  while (n < max(a.size(), b.size())) n <<= 1;
  n <<= 1;
  fa.resize(n), fb.resize(n);
  fft(fa, false), fft(fb, false);
  for (size_t i = 0; i < n; ++i) fa[i] *= fb[i];
  fft(fa, true);
  a.resize(n);
  for (size_t i = 0; i < a.size(); ++i)
    a[i] = ((long long)(fa[i].real() + 0.5));
}
void polymulmod(vector<long long>& a, vector<long long>& b, bool takemod,
                long long mod, bool give_a_fuck_about_precision) {
  long long sa = a.size(), sb = b.size();
  if (sa * 1ll * sb <= 100000)
    mul_naive(a, b);
  else if (!give_a_fuck_about_precision)
    multiply(a, b);
  else
    NTT_mul(a, b);
  if (takemod)
    for (long long i = 0; i < a.size(); i++) a[i] %= mod;
}
const long long mod = 13313;
vector<long long> polymul(vector<vector<long long> >& X, long long k) {
  if (X.empty()) {
    vector<long long> ret;
    ret.emplace_back(1);
    return ret;
  }
  if (X.size() == 1) return X[0];
  long long k1 = (X.size() >> 1);
  vector<vector<long long> > v1(X.begin(), X.begin() + k1);
  vector<vector<long long> > v2(X.begin() + k1, X.end());
  vector<long long> V1 = polymul(v1, k), V2 = polymul(v2, k);
  polymulmod(V1, V2, 1, mod, 1);
  V1.resize(min((long long)V1.size(), k + 1));
  return V1;
}
const long long N = 4e5 + 10;
long long fact[N], invfact[N], cnt[N];
vector<long long> V;
vector<vector<long long> > vec;
long long C(long long n, long long k) {
  if (n < k || k < 0) return 0;
  return (fact[n] * 1ll * ((invfact[k] * 1ll * invfact[n - k]) % mod)) % mod;
}
signed main() {
  cin.tie(0);
  cout.tie(0);
  ios_base::sync_with_stdio(false);
  long long begtime = clock();
  ;
  long long n, x;
  cin >> n >> x;
  long long pre[n + 1], arr[n + 1];
  pre[0] = 0;
  map<long long, long long> count;
  count[0] = 1;
  for (long long i = 1; i <= n; i += 1) {
    cin >> arr[i];
    if (arr[i] < x)
      pre[i] = pre[i - 1] + 1;
    else
      pre[i] = pre[i - 1];
    count[pre[i]]++;
  }
  vector<long long> poly1(n + 1), poly2(n + 1);
  for (long long i = 0; i <= n; i += 1) poly1[i] = count[i];
  for (long long i = 0; i <= n; i += 1) poly2[i] = poly1[n - i];
  polymulmod(poly1, poly2, false, 10000, true);
  auto prod = poly1;
  vector<long long> ans(n + 1);
  for (long long i = 1; i <= n; i += 1) {
    ans[i] = prod[n - i];
  }
  ans[0] = 0;
  long long streak = 0;
  long long s[n + 1];
  s[0] = 0;
  for (long long i = 1; i <= n; i += 1) s[i] = s[i - 1] + i;
  for (long long i = 1; i <= n; i += 1) {
    if (arr[i] >= x)
      streak += 1;
    else {
      if (streak > 0) ans[0] += s[streak];
      streak = 0;
    }
  }
  if (streak > 0) ans[0] += s[streak];
  for (auto k : ans) {
    cout << k << " ";
  }
  long long endtime = clock();
  cerr << endl
       << "Time elapsed: " << (endtime - begtime) * 1000 / CLOCKS_PER_SEC
       << " ms";
  return 0;
}
