#include <bits/stdc++.h>
using namespace std;
int n, k;
vector<int> v;
int a[400005];
long long ans = 0;
int lowbit(int x) { return x & -x; }
void updata(int pos, int v) {
  for (; pos < 400005 && pos > 0; pos += lowbit(pos)) a[pos] += v;
}
long long query(int x) {
  long long cnt = 0;
  while (x > 0) {
    cnt += a[x];
    x -= lowbit(x);
  }
  return cnt;
}
struct no {
  int x, r, q, L, R;
} node[100005];
bool cmp1(no &p1, no &p2) { return p1.r < p2.r; }
bool cmp2(no p1, no p2) { return p1.q < p2.q; }
void cdq(int l, int r) {
  if (l == r) return;
  int mid = (l + r) / 2;
  cdq(l, mid);
  cdq(mid + 1, r);
  sort(node + l, node + mid + 1, cmp2);
  sort(node + mid + 1, node + r + 1, cmp2);
  int p1 = mid + 1, p2 = mid + 1;
  for (int i = l; i <= mid; i++) {
    while (p2 <= r && node[p2].q <= node[i].q + k) {
      updata(node[p2].x, 1);
      p2++;
    }
    while (p1 < p2 && node[p1].q < node[i].q - k) {
      updata(node[p1].x, -1);
      p1++;
    }
    ans += query(node[i].R) - query(node[i].L - 1);
  }
  while (p1 < p2) {
    updata(node[p1].x, -1);
    p1++;
  }
}
int main() {
  scanf("%d%d", &n, &k);
  v.push_back(0);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d", &node[i].x, &node[i].r, &node[i].q);
    v.push_back(node[i].x);
  }
  sort(v.begin() + 1, v.end());
  int cnt = unique(v.begin() + 1, v.end()) - v.begin() - 1;
  for (int i = 1; i <= n; i++) {
    node[i].L =
        lower_bound(v.begin() + 1, v.begin() + cnt + 1, node[i].x - node[i].r) -
        v.begin();
    node[i].R =
        upper_bound(v.begin() + 1, v.begin() + cnt + 1, node[i].x + node[i].r) -
        v.begin() - 1;
    node[i].x =
        lower_bound(v.begin() + 1, v.begin() + cnt + 1, node[i].x) - v.begin();
  }
  sort(node + 1, node + n + 1, cmp1);
  cdq(1, n);
  cout << ans << endl;
  return 0;
}
