#include <bits/stdc++.h>
using namespace std;
constexpr int N = 100001;
constexpr int K = 301;
struct Query {
  int row;
  int left;
  int right;
  bool val;
  bool operator<(const Query& other) const {
    if (row == other.row) {
      return left == other.left ? right < other.right : left < other.left;
    }
    return row < other.row;
  }
};
constexpr int MIN_INF = (int)-1e9 - 7;
int n, k;
vector<int> last_updated;
vector<int> cnt;
vector<int> arr;
vector<int64_t> ans;
vector<Query> queries;
int getIndex(int val) {
  int lo = 0, hi = arr.size() - 1, mid;
  while (lo <= hi) {
    mid = (lo + hi) / 2;
    if (arr[mid] < val) {
      lo = mid + 1;
    } else {
      hi = mid - 1;
    }
  }
  return lo;
}
int main() {
  int x, y;
  scanf("%d%d", &n, &k);
  vector<pair<int, int>> points;
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &x, &y);
    points.push_back({x, y});
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < k; ++j) {
      arr.push_back(points[i].second - k + j + 1);
    }
  }
  points.clear();
  sort(arr.begin(), arr.end());
  int j = 0;
  for (int i = 1; i < arr.size(); ++i) {
    if (arr[j] == arr[i]) continue;
    arr[++j] = arr[i];
  }
  arr.resize(j + 1);
  for (int i = 0; i < n; ++i) {
    int left = getIndex(points[i].second - k + 1);
    int right = getIndex(points[i].second);
    queries.push_back({points[i].first - k + 1, left, right, true});
    queries.push_back({points[i].first + 1, left, right, false});
  }
  sort(queries.begin(), queries.end());
  arr.clear();
  arr.shrink_to_fit();
  ans.resize(n + 1, 0);
  cnt.resize(j + 1, 0);
  last_updated.resize(j + 1, MIN_INF);
  for (int q = 0; q < 2 * n; ++q) {
    for (int i = queries[q].left; i <= queries[q].right; ++i) {
      ans[cnt[i]] += queries[q].row - last_updated[i];
      last_updated[i] = queries[q].row;
      cnt[i] += queries[q].val ? 1 : -1;
    }
  }
  for (int i = 1; i <= n; ++i) {
    cout << ans[i] << " ";
  }
  cout << endl;
  return 0;
}
