from bisect import bisect_left, bisect_right def segfunc(x,y): return max(x, y) class LazySegTree_RAQ: def __init__(self,init_val,segfunc,ide_ele): n = len(init_val) self.segfunc = segfunc self.ide_ele = ide_ele self.num = 1<<(n-1).bit_length() self.tree = [ide_ele]*2*self.num self.lazy = [0]*2*self.num for i in range(n): self.tree[self.num+i] = init_val[i] for i in range(self.num-1,0,-1): self.tree[i] = self.segfunc(self.tree[2*i], self.tree[2*i+1]) def gindex(self,l,r): l += self.num r += self.num lm = l>>(l&-l).bit_length() rm = r>>(r&-r).bit_length() ans = [] while r>l: if l<=lm: ans.append(l) if r<=rm: ans.append(r) r >>= 1 l >>= 1 while l: ans.append(l) l >>= 1 return ans def propagates(self,ids): for i in reversed(ids): v = self.lazy[i] if v==0: continue self.lazy[i] = 0 self.lazy[2*i] += v self.lazy[2*i+1] += v self.tree[2*i] += v self.tree[2*i+1] += v def add(self,l,r,x): ids = self.gindex(l,r) l += self.num r += self.num while l>= 1 l >>= 1 for i in ids: self.tree[i] = self.segfunc(self.tree[2*i], self.tree[2*i+1]) + self.lazy[i] def query(self,l,r): self.propagates(self.gindex(l,r)) res = self.ide_ele l += self.num r += self.num while l>= 1 r >>= 1 return res N, A = map(int, input().split()) P = sorted([list(map(int, input().split())) for _ in range(N)], key=lambda x:x[0]) INF = 1<<60 def compress(A): S = sorted(set(A)) D = dict() for i in range(len(S)): D[S[i]] = i return D, S def func(B): X = [] Y = [] for x, y, v in P: X.append(x+B) X.append(x) X.append(x+B+1) X.append(x-1) Y.append(y) Y.append(y-A) Y.append(y-(A-1)) Y.append(y+1) Y.append(y-A-1) Y.append(y-(A-1)-1) X = sorted(set(X)) D, S = compress(Y) L1 = [] L2 = [] for i in range(len(S)): L1.append(bisect_left(S, S[i]-A)) L2.append(bisect_left(S, S[i]-(A-1))) seg1 = LazySegTree_RAQ([0]*len(D), segfunc, -INF) seg2 = LazySegTree_RAQ([0]*len(D), segfunc, -INF) idxR = 0 idxL = 0 ans = 0 for x in X: while idxR < N and P[idxR][0] <= x: _, y, v = P[idxR] seg1.add(L1[D[y]], D[y]+1, v) seg2.add(L2[D[y]], D[y]+1, v) idxR += 1 while idxL < N and P[idxL][0] < x-B: _, y, v = P[idxL] seg1.add(L1[D[y]], D[y]+1, -v) seg2.add(L2[D[y]], D[y]+1, -v) idxL += 1 ans = max(ans, seg1.query(0, len(D)), seg2.query(0, len(D))) return ans print(max(func(A), func(A-1), 0))