#include<bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define eps 1e-2
#define gcd __gcd
#define pb push_back
#define PI acos(-1.0)
#define lowbit(x) (x)&(-x)
#define bug printf("!!!!!\n");
#define mem(x,y) memset(x,y,sizeof(x))
typedef long long LL;
typedef long double LD;
typedef pair<int,int> pii;
typedef unsigned long long uLL;
const int maxn = 1e6+2;
const int INF = 1<<30;
const int mod = 1e9+7;
const int N = 1e6+10;
int n,k;
struct node{
int x,r,f,L,R;
}nd[maxn];
std::vector<int> v;
struct BIT{
int n,c[N];
void init(int _n){n=_n;for(int i=1;i<=n;++i) c[i]=0;}
int Lowbit(int x){return x&(-x);}
int get_sum(int k){int ans=c[k];while((k-=Lowbit(k))>0) ans+=c[k];return ans;}
void add(int t,int v){c[t]+=v;while((t+=Lowbit(t))<=n) c[t]+=v;}
}bt;
bool cmp(node a,node b){
if(a.f!=b.f) return a.f<b.f;
if(a.x!=b.x) return a.x<b.x;
return a.r<b.r;
}
bool cmp2(node a,node b){
if(a.r!=b.r) return a.r>b.r;
if(a.f!=b.f) return a.f<b.f;
return a.x<b.x;
}
LL ans=0;
void dfs(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
dfs(l,mid);dfs(mid+1,r);
sort(nd+l,nd+mid+1,cmp);
sort(nd+mid+1,nd+r+1,cmp);
int l1=l,l2=l-1;
for(int i=mid+1;i<=r;i++){
while(l1<=mid&&nd[l1].f-nd[i].f<-k) bt.add(nd[l1].x,-1),++l1;
while(l2<mid&&nd[l2+1].f-nd[i].f<=k){
l2++;
bt.add(nd[l2].x,1);
}
ans+=bt.get_sum(nd[i].R)-bt.get_sum(nd[i].L-1);
}
for(int i=l1;i<=l2;i++) bt.add(nd[i].x,-1);
}
void solve(){
bt.init(1e6);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
int x,r,f;scanf("%d%d%d",&x,&r,&f);
v.push_back(x);
v.push_back(max(0,x-r));
v.push_back(x+r);
nd[i]={x,r,f,max(0,x-r),x+r};
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()),v.end());
for(int i=1;i<=n;i++){
nd[i].x=lower_bound(v.begin(),v.end(),nd[i].x)-v.begin()+1;
nd[i].L=lower_bound(v.begin(),v.end(),nd[i].L)-v.begin()+1;
nd[i].R=lower_bound(v.begin(),v.end(),nd[i].R)-v.begin()+1;
}
sort(nd+1,nd+1+n,cmp2);
dfs(1,n);
cout<<ans<<endl;
return;
}
int main()
{
int t = 1;
while(t--){
solve();
}
return 0;
}