#include <bits/stdc++.h>
struct {
  inline operator int() {
    int x;
    return scanf("%d", &x), x;
  }
  inline operator long long() {
    long long x;
    return scanf("%lld", &x), x;
  }
  template <class T>
  inline void operator()(T &x) {
    x = *this;
  }
  template <class T, class... A>
  inline void operator()(T &x, A &...a) {
    x = *this;
    this->operator()(a...);
  }
} read;
const int maxn = 300005;
int al[maxn], ar[maxn];
std::vector<int> tor[maxn];
int ans[maxn];
struct Tree {
  int lti, rti;
  int val;
};
Tree pool[maxn * 10];
int pp;
void lain(int &now, int L, int R, int p) {
  pool[++pp] = pool[now];
  now = pp;
  ++pool[now].val;
  if (L == R) return;
  int M = (L + R) >> 1;
  if (p <= M)
    lain(pool[now].lti, L, M, p);
  else
    lain(pool[now].rti, M + 1, R, p);
}
int query(int now, int L, int R, int l, int r) {
  if (!now or r < L or l > R) return 0;
  if (l <= L and R <= r) return pool[now].val;
  int M = (L + R) >> 1;
  return query(pool[now].lti, L, M, l, r) +
         query(pool[now].rti, M + 1, R, l, r);
}
int T[maxn];
int main() {
  int n = read, m = read;
  for (int i = 1; i <= n; i++) {
    read(al[i], ar[i]);
    tor[al[i]].push_back(ar[i]);
  }
  for (int l = 0; l <= m; l++) {
    if (l) T[l] = T[l - 1];
    for (int r : tor[l]) lain(T[l], 0, m, r);
  }
  for (int t = 0; t <= m; t++)
    for (int d = 1; d <= (t ? m / t : m); d++) {
      int l = t * d + 1, r = t * d + d;
      ans[d] += query(T[r], 0, m, r, m) - query(T[l - 1], 0, m, r, m);
    }
  for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
}
