#include <bits/stdc++.h>
using namespace std;
struct Query {
  int l, r, h, add;
  void Add(int a, int b, int c, int d) { l = a, r = b, h = c, add = d; }
} a[2 * 100005];
vector<int> dx;
vector<int> dy;
int n, k;
long long dem[2 * 100005], dd[2 * 100005], cur[2 * 100005], pre[2 * 100005],
    INF = -1e9 - 7;
int x[100005], y[100005];
int cmp(Query a, Query b) { return a.h < b.h; }
int main() {
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> x[i] >> y[i];
    dx.push_back(x[i] - k + 1);
    dx.push_back(x[i] + 1);
    dy.push_back(y[i] - k + 1);
    dy.push_back(y[i] + 1);
  }
  sort(dx.begin(), dx.end());
  sort(dy.begin(), dy.end());
  dx.resize(distance(dx.begin(), unique(dx.begin(), dx.end())));
  dy.resize(distance(dy.begin(), unique(dy.begin(), dy.end())));
  for (int i = 1; i <= n; i++) {
    int st = lower_bound(dx.begin(), dx.end(), x[i] - k + 1) - dx.begin();
    int en = lower_bound(dx.begin(), dx.end(), x[i] + 1) - dx.begin();
    int l1 = lower_bound(dy.begin(), dy.end(), y[i] - k + 1) - dy.begin();
    int l2 = lower_bound(dy.begin(), dy.end(), y[i] + 1) - dy.begin();
    a[2 * i - 1].Add(st, en, l1, 1);
    a[2 * i].Add(st, en, l2, -1);
  }
  sort(a + 1, a + 2 * n + 1, cmp);
  for (int i = 0; i < dx.size(); i++) pre[i] = INF;
  int cur = 1;
  for (int i = 0; i < dy.size(); i++) {
    while (a[cur].h <= i && cur <= 2 * n) {
      for (int j = a[cur].l; j < a[cur].r; j++) {
        dd[dem[j]] += (dem[j] > 0) * (dy[i] - pre[j]) * (dx[j + 1] - dx[j]);
        dem[j] += a[cur].add;
        pre[j] = dy[i];
      }
      ++cur;
    }
  }
  for (int i = 1; i <= n; i++) cout << dd[i] << " ";
}
