#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
long long tr[N];
int n, k;
struct node {
  int x, r, q;
} s[N], s1[N];
int lowbit(int x) { return x & -x; }
void add(int x, int c) {
  int i;
  for (i = x; i < N; i += lowbit(i)) {
    tr[i] += c;
  }
}
long long sum(int x) {
  int i;
  long long res = 0;
  for (i = x; i; i -= lowbit(i)) {
    res += tr[i];
  }
  return res;
}
vector<long long> num;
bool cmpa(node a, node b) { return a.r > b.r; }
bool cmpb(node a, node b) { return a.q < b.q; }
int find(int x) {
  return lower_bound(num.begin(), num.end(), x) - num.begin() + 1;
}
long long ans = 0;
void cdq(int l, int r) {
  if (l == r) return;
  int mid = l + r >> 1;
  cdq(l, mid);
  cdq(mid + 1, r);
  int i;
  int L = l, R = l - 1;
  for (int i = mid + 1; i <= r; i++) {
    while (L <= mid && s[i].q - s[L].q > k) add(find(s[L++].x), -1);
    while (R < mid && s[R + 1].q - s[i].q <= k) add(find(s[++R].x), 1);
    ans += sum(find(s[i].x + s[i].r)) - sum(find(s[i].x - s[i].r) - 1);
  }
  for (int i = L; i <= R; i++) add(find(s[i].x), -1);
  sort(s + l, s + r + 1, cmpb);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> k;
  int i;
  for (i = 1; i <= n; i++) {
    cin >> s[i].x >> s[i].r >> s[i].q;
    num.push_back(s[i].x);
    num.push_back(s[i].x - s[i].r);
    num.push_back(s[i].x + s[i].r);
  }
  sort(num.begin(), num.end());
  num.erase(unique(num.begin(), num.end()), num.end());
  sort(s + 1, s + 1 + n, cmpa);
  for (i = 1; i <= n; i++) s1[i] = s[i];
  cdq(1, n);
  cout << ans << endl;
}
