#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y;
  inline bool operator<(const point &a) const { return x < a.x; }
} arr[100005];
struct query_tp {
  int col, l, r, delta;
  query_tp() {}
  query_tp(int _col, int _l, int _r, int _delta) {
    col = _col;
    l = _l;
    r = _r;
    delta = _delta;
  }
  inline bool operator<(const query_tp &a) const { return col < a.col; }
};
long long ans[100005];
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 0; i < n; i++) scanf("%d%d", &arr[i].x, &arr[i].y);
  sort(arr, arr + n);
  vector<query_tp> query;
  vector<int> app;
  for (int i = 0; i < n; i++) {
    int l = arr[i].x - k;
    if (app.size()) l = max(l, *app.rbegin());
    for (int j = l + 1; j <= arr[i].x; j++) app.push_back(j);
    query.push_back(query_tp(arr[i].y - k + 1, arr[i].x - k + 1, arr[i].x, 1));
    query.push_back(query_tp(arr[i].y + 1, arr[i].x - k + 1, arr[i].x, -1));
  }
  sort(query.begin(), query.end());
  int cnt = app.size(), q_cnt = query.size();
  for (int i = 0; i < q_cnt; i++) {
    query[i].l = lower_bound(app.begin(), app.end(), query[i].l) - app.begin();
    query[i].r = lower_bound(app.begin(), app.end(), query[i].r) - app.begin();
  }
  app.clear();
  vector<int>().swap(app);
  vector<int> lst(cnt, -1e9), num(cnt, 0);
  for (int i = 0; i < q_cnt; i++) {
    for (int j = query[i].l; j <= query[i].r; j++) {
      if (lst[j] != -1e9) ans[num[j]] += query[i].col - lst[j];
      num[j] += query[i].delta;
      lst[j] = query[i].col;
    }
  }
  for (int i = 1; i <= n; i++) printf("%lld%c", ans[i], " \n"[i == n]);
  return 0;
}
