#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e9;
const int MAXN = 1e5 + 7;
int root[MAXN * 40], ls[MAXN * 40], lt[MAXN * 40];
long long sum[MAXN * 40];
int n, k, cnt;
vector<int> ve;
typedef struct Node {
  int x, r, q;
  friend bool operator<(const Node &a, const Node &b) { return a.r > b.r; }
} Node;
Node node[MAXN];
int getid(int x) {
  return lower_bound(ve.begin(), ve.end(), x) - ve.begin() + 1;
}
void update(int p, int l, int r, int &rt) {
  if (!rt) rt = ++cnt;
  if (l == r) {
    sum[rt] += 1;
    return;
  }
  int mid = (l + r) / 2;
  if (p <= mid)
    update(p, l, mid, ls[rt]);
  else
    update(p, mid + 1, r, lt[rt]);
  sum[rt] += 1;
}
long long query(int L, int R, int l, int r, int rt) {
  if (!rt) return 0;
  if (L <= l && R >= r) return sum[rt];
  long long ans = 0;
  int mid = (l + r) / 2;
  if (L <= mid) ans += query(L, R, l, mid, ls[rt]);
  if (R > mid) ans += query(L, R, mid + 1, r, lt[rt]);
  return ans;
}
int main() {
  while (~scanf("%d %d", &n, &k)) {
    ve.clear();
    memset(root, 0, sizeof(root));
    memset(ls, 0, sizeof(ls));
    memset(lt, 0, sizeof(lt));
    memset(sum, 0, sizeof(sum));
    cnt = 0;
    for (int i = 0; i < n; ++i) {
      scanf("%d %d %d", &node[i].x, &node[i].r, &node[i].q);
      ve.push_back(node[i].q);
      ve.push_back(node[i].q - k);
      ve.push_back(node[i].q + k);
    }
    sort(node, node + n);
    sort(ve.begin(), ve.end());
    ve.erase(unique(ve.begin(), ve.end()), ve.end());
    long long ans = 0;
    for (int i = 0; i < n; ++i) {
      int st = getid(node[i].q - k), sk = getid(node[i].q + k);
      for (int j = st; j <= sk; ++j) {
        if (!root[j]) continue;
        int l = max(0, node[i].x - node[i].r);
        int r = min(N, node[i].x + node[i].r);
        ans += query(l, r, 0, N, root[j]);
      }
      int id = getid(node[i].q);
      update(node[i].x, 0, N, root[id]);
    }
    printf("%lld\n", ans);
  }
  return 0;
}
