#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Point {
  int x, y;
};
void sweep(vector<ll>& result, unordered_map<int, int>& band, int k,
           int scale) {
  struct Event {
    int x, delta;
  };
  vector<Event> events;
  for (auto kv : band) {
    int x = kv.first, delta = kv.second;
    events.push_back({x - (k - 1), delta});
    events.push_back({x + 1, -delta});
  }
  sort(begin(events), end(events), [](Event a, Event b) { return a.x < b.x; });
  int count = 0;
  for (int i = 0; i + 1 < events.size(); i++) {
    count += events[i].delta;
    result[count] += (events[i + 1].x - events[i].x) * scale;
  }
}
vector<ll> solve(int n, int k, vector<Point> points) {
  struct Event {
    int y, delta, x;
  };
  vector<Event> events;
  for (auto p : points) {
    events.push_back({p.y - (k - 1), 1, p.x});
    events.push_back({p.y + 1, -1, p.x});
  }
  sort(begin(events), end(events), [](Event a, Event b) { return a.y < b.y; });
  vector<ll> result(n + 1);
  unordered_map<int, int> band;
  for (int i = 0; i + 1 < events.size(); i++) {
    auto event = events[i];
    band[event.x] += event.delta;
    if (events[i].y != events[i + 1].y) {
      for (auto it = band.begin(); it != band.end();)
        if (it->second == 0)
          it = band.erase(it);
        else
          it++;
      sweep(result, band, k, events[i + 1].y - events[i].y);
    }
  }
  return result;
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, k;
  cin >> n >> k;
  vector<Point> points(n);
  for (int i = 0; i < n; i++) {
    int x, y;
    cin >> x >> y;
    points[i] = {x, y};
  }
  auto answer = solve(n, k, points);
  for (int i = 1; i <= n; i++) cout << answer[i] << ' ';
  cout << endl;
}
