#include <bits/stdc++.h>
using namespace std;
struct Condensator {
  Condensator() {}
  void AddValue(const int x) { a.push_back(x); }
  void Condense() {
    sort(a.begin(), a.end());
    a.resize(unique(a.begin(), a.end()) - a.begin());
  }
  int ValueToId(const int x) const {
    return lower_bound(a.begin(), a.end(), x) - a.begin();
  }
  int IdToValue(const int id) const { return a[id]; }
  vector<int> a;
};
struct IntervalTree {
  IntervalTree(const int N) : N(N), adds(4 * N, 0), maxValues(4 * N, 0) {}
  void AddImpl(const int L, const int R, const int l, const int r,
               const int node, const int value) {
    Relax(node);
    if (r < L || R < l) {
      return;
    }
    if (L <= l && r <= R) {
      adds[node] += value;
      Relax(node);
      return;
    }
    AddImpl(L, R, l, (l + r) / 2, node * 2 + 1, value);
    AddImpl(L, R, (l + r) / 2 + 1, r, node * 2 + 2, value);
    maxValues[node] = max(maxValues[node * 2 + 1], maxValues[node * 2 + 2]);
  }
  void Add(const int L, const int R, const int value) {
    AddImpl(L, R, 0, N - 1, 0, value);
  }
  int GetMax() {
    Relax(0);
    return maxValues[0];
  }
  void Relax(const int node) {
    const int valueToAdd = adds[node];
    if (!valueToAdd) {
      return;
    }
    adds[node] = 0;
    if (node * 2 + 2 < 4 * N) {
      adds[node * 2 + 1] += valueToAdd;
      adds[node * 2 + 2] += valueToAdd;
    }
    maxValues[node] += valueToAdd;
  }
  const int N;
  vector<int> adds;
  vector<int> maxValues;
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, r;
  cin >> n >> r;
  Condensator c;
  vector<pair<int, int>> a(n);
  for (int i = 0; i < n; ++i) {
    int x, y;
    cin >> x >> y;
    a[i] = make_pair(x + y, x - y);
    c.AddValue(a[i].second);
    c.AddValue(a[i].second - 2 * r);
  }
  c.Condense();
  IntervalTree tree(c.a.size());
  sort(a.begin(), a.end());
  int maxPoints = 1;
  for (int i = 0, j = 0; i < n; ++i) {
    for (; j < n && a[j].first - a[i].first <= 2 * r; ++j) {
      tree.Add(c.ValueToId(a[j].second - 2 * r), c.ValueToId(a[j].second), 1);
    }
    maxPoints = max(maxPoints, tree.GetMax());
    tree.Add(c.ValueToId(a[i].second - 2 * r), c.ValueToId(a[i].second), -1);
  }
  cout << maxPoints << endl;
  return 0;
}
