#include <bits/stdc++.h>
using namespace std;
const int MaxK = 305, MaxN = 100005, inf = 0x3f3f3f3f;
struct Query {
  int row, l, r, lb, rb, flag;
  inline Query() {}
  inline Query(int _row, int _l, int _r, bool _flag)
      : row(_row), l(_l), r(_r), flag(_flag) {}
  inline bool operator<(const Query& other) const { return row < other.row; }
};
pair<int, int> a[MaxN];
int main() {
  ios_base::sync_with_stdio(false);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; ++i) cin >> a[i].first >> a[i].second;
  sort(a, a + n);
  vector<int> lv;
  for (int i = 0; i < n; ++i) {
    int st;
    if (lv.empty())
      st = a[i].first - k + 1;
    else
      st = max(a[i].first - k + 1, lv.back() + 1);
    for (int j = st; j <= a[i].first; ++j) lv.emplace_back(j);
  }
  vector<Query> qv;
  for (int i = 0; i < n; ++i) {
    qv.emplace_back(
        Query(a[i].second - k + 1, a[i].first - k + 1, a[i].first, 1));
    qv.emplace_back(Query(a[i].second + 1, a[i].first - k + 1, a[i].first, 0));
  }
  for (Query& now : qv) {
    now.lb = lower_bound(lv.begin(), lv.end(), now.l) - lv.begin();
    now.rb = upper_bound(lv.begin(), lv.end(), now.r) - lv.begin();
  }
  sort(qv.begin(), qv.end());
  int cur = lv.size();
  lv.clear();
  lv.shrink_to_fit();
  vector<int> v(cur + 1, 0), last(cur + 1, -inf);
  vector<long long> ans(n + 1, 0);
  for (Query now : qv) {
    for (int i = now.lb; i < now.rb; ++i) {
      if (last[i] != -inf) ans[v[i]] += now.row - last[i];
      if (now.flag)
        ++v[i];
      else
        --v[i];
      last[i] = now.row;
    }
  }
  for (int i = 1; i <= n; ++i) cout << ans[i] << ' ';
  cout << endl;
  return 0;
}
