#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  bool operator<(const Point &p) const { return x < p.x; }
} a[100001];
struct Q {
  int l, r, y, type, rl, rr;
  bool operator<(const Q &x) const { return y < x.y; }
} q[100001 << 1];
vector<int> tt;
int K, n;
long long ans[100001];
int main() {
  scanf("%d%d", &n, &K);
  int i, cnt = 0, j, tot = 0;
  for (i = 1; i <= n; i++) scanf("%d%d", &a[i].x, &a[i].y);
  sort(a + 1, a + n + 1);
  for (i = 1; i <= n; i++) {
    int st =
        (!tt.empty()) ? max(tt.back() + 1, a[i].x - K + 1) : a[i].x - K + 1;
    for (j = st; j <= a[i].x; j++) tt.push_back(j);
  }
  for (i = 1; i <= n; i++) {
    q[++tot].rl = a[i].x - K + 1;
    q[tot].rr = a[i].x;
    q[tot].y = a[i].y - K + 1;
    q[tot].type = 1;
    q[++tot].rl = a[i].x - K + 1;
    q[tot].rr = a[i].x;
    q[tot].y = a[i].y + 1;
    q[tot].type = -1;
  }
  for (i = 1; i <= tot; i++) {
    q[i].l = lower_bound(tt.begin(), tt.end(), q[i].rl) - tt.begin();
    q[i].r = upper_bound(tt.begin(), tt.end(), q[i].rr) - tt.begin();
  }
  cnt = tt.size();
  tt.clear();
  tt.shrink_to_fit();
  sort(q + 1, q + tot + 1);
  vector<int> sum(cnt, 0);
  vector<int> lst(cnt, 0x3f3f3f3f);
  for (i = 1; i <= tot; i++) {
    int l = q[i].l, r = q[i].r;
    for (j = l; j < r; j++) {
      if (lst[j] != 0x3f3f3f3f) {
        ans[sum[j]] += q[i].y - lst[j];
      }
      sum[j] += q[i].type;
      lst[j] = q[i].y;
    }
  }
  for (i = 1; i <= n; i++) printf("%lld ", ans[i]);
}
