#include "bits/stdc++.h" using namespace std; const int N = 2e5 + 5; const int SZ = 3.1e7 + 7; const int SN = 1 << 19; int n , x , y; int lat[N] , lon[N] , hei[N] , arr[N]; vector < int > v[N]; struct data{ long long mx; int lft; int rgt; }; data segtree[SZ]; int cur; int root[SN]; long long dp[N]; long long ans; void update(int l , int r , int &node , int idx , long long val){ if(!node){ if(cur == SZ - 1){ return; } node = ++cur; } segtree[node].mx = max(segtree[node].mx , val); if(l < r){ int mid = l + r >> 1; if(idx <= mid){ update(l , mid , segtree[node].lft , idx , val); } else{ update(mid + 1 , r , segtree[node].rgt , idx , val); } } } void update(int l , int r , int node , int idxo , int idxi , long long val){ update(1 , N - 1 , root[node] , idxi , val); if(l < r){ int mid = l + r >> 1; if(idxo <= mid){ update(l , mid , node + node , idxo , idxi , val); } else{ update(mid + 1 , r , node + node + 1 , idxo , idxi , val); } } } long long query(int l , int r , int node , int ql , int qr){ if(l > qr || r < ql || !node){ return 0; } if(l >= ql && r <= qr){ return segtree[node].mx; } int mid = l + r >> 1; return max(query(l , mid , segtree[node].lft , ql , qr) , query(mid + 1 , r , segtree[node].rgt , ql , qr)); } long long query(int l , int r , int node , int qlo , int qro , int qli , int qri){ if(l > qro || r < qlo || !root[node]){ return 0; } if(l >= qlo && r <= qro){ return query(1 , N - 1 , root[node] , qli , qri); } int mid = l + r >> 1; return max(query(l , mid , node + node , qlo , qro , qli , qri) , query(mid + 1 , r , node + node + 1 , qlo , qro , qli , qri)); } int main(){ cur = 0; scanf("%d %d %d" , &n , &x , &y); for(int i = 1 ; i <= n ; ++i){ scanf("%d %d %d %d" , lat + i , lon + i , hei + i , arr + i); v[hei[i]].emplace_back(i); } for(int i = 1 ; i < N ; ++i){ for(int idx : v[i]){ int lat = ::lat[idx]; int lon = ::lon[idx]; dp[idx] = query(1 , N - 1 , 1 , max(1 , lat - x) , min(lat + x , N - 1) , max(1 , lon - y) , min(N - 1 , lon + y)) + arr[idx]; } for(int idx : v[i]){ if(dp[idx] > 0){ int lat = ::lat[idx]; int lon = ::lon[idx]; update(1 , N - 1 , 1 , lat , lon , dp[idx]); } ans = max(ans , dp[idx]); } } printf("%lld\n" , ans); }