#include <bits/stdc++.h>
const int INF_INT = 0x3f3f3f3f;
const long long INF_LL = 0x7f7f7f7f;
const int MOD = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1);
using namespace std;
const int N = 100010;
int n, k;
int cnt[N << 1];
long long ans[N];
int pre[N << 1];
int x[N], y[N];
vector<int> Hash;
struct Query {
  int l, r, y, flag;
  Query(int l, int r, int y, int flag) : l(l), r(r), y(y), flag(flag) {}
  Query() {}
  bool operator<(const Query& rhs) const { return y < rhs.y; }
};
vector<Query> qs;
int main(int argc, char const* argv[]) {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
  memset(cnt, 0, sizeof(cnt));
  memset(ans, 0, sizeof(ans));
  for (int i = 1; i <= 2 * n; i++) pre[i] = -INF_INT;
  Hash.push_back(-INF_INT);
  for (int i = 1; i <= n; i++) {
    Hash.push_back(x[i]);
    Hash.push_back(x[i] + k);
  }
  sort(Hash.begin(), Hash.end());
  Hash.resize(unique(Hash.begin(), Hash.end()) - Hash.begin());
  for (int i = 1; i <= n; i++) {
    int l = upper_bound(Hash.begin(), Hash.end(), x[i]) - Hash.begin();
    int r = lower_bound(Hash.begin(), Hash.end(), x[i] + k) - Hash.begin();
    qs.push_back(Query(l, r, y[i], 1));
    qs.push_back(Query(l, r, y[i] + k, -1));
  }
  sort(qs.begin(), qs.end());
  for (auto& q : qs) {
    for (int i = q.l; i <= q.r; i++) {
      ans[cnt[i]] += 1ll * (Hash[i] - Hash[i - 1]) * (q.y - pre[i]);
      cnt[i] += q.flag;
      pre[i] = q.y;
    }
  }
  for (int i = 1; i <= n; i++) printf("%I64d ", ans[i]);
  puts("");
  return 0;
}
