#include <bits/stdc++.h>
using namespace std;
struct NODE {
  long long x1, x2, y, cover;
  NODE() {}
  NODE(long long _x1, long long _x2, long long _y, long long _cover)
      : x1(_x1), x2(_x2), y(_y), cover(_cover) {}
  bool operator<(const NODE &t) const {
    return y < t.y || (y == t.y && cover > t.cover);
  }
};
vector<int> vx;
vector<NODE> ask;
long long ans[100005], pre[200005], cnt[200005];
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; ++i) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    vx.push_back(x), vx.push_back(x + k);
    ask.push_back(NODE(x, x + k, y, 1LL));
    ask.push_back(NODE(x, x + k, y + k, -1LL));
  }
  sort(vx.begin(), vx.end()), sort(ask.begin(), ask.end());
  vx.erase(unique(vx.begin(), vx.end()), vx.end());
  for (int i = 0; i < (int)ask.size(); ++i) {
    int l = upper_bound(vx.begin(), vx.end(), ask[i].x1) - vx.begin();
    int r = lower_bound(vx.begin(), vx.end(), ask[i].x2) - vx.begin();
    for (int j = l; j <= r; ++j) {
      ans[cnt[j]] += (vx[j] - vx[j - 1]) * (ask[i].y - pre[j]);
      cnt[j] += ask[i].cover;
      pre[j] = ask[i].y;
    }
  }
  for (int i = 1; i <= n; ++i) printf("%lld\n", ans[i]);
  return 0;
}
