#include using namespace std; typedef long long Long; typedef unsigned long long Ulong; const int NN = 200005; const Long INFI = static_cast(-1e15); struct City { int lat,lon,ht; Long pts; }CITY[NN]; int N,X,Y; Long SCORE[NN]; vector G[NN]; void find_score(int cur_node, int prev_node) { SCORE[cur_node] = CITY[cur_node].pts; for (int i = 0; i < G[cur_node].size(); ++i) { int adj_node = G[cur_node][i]; if (SCORE[adj_node] <= INFI) { find_score(adj_node, cur_node); } SCORE[cur_node] = max(SCORE[cur_node], CITY[cur_node].pts + SCORE[adj_node]); } } int main() { scanf("%d %d %d", &N, &X, &Y); for (int i = 0; i < N; ++i) { scanf("%d %d %d %lld", &CITY[i].lat, &CITY[i].lon, &CITY[i].ht, &CITY[i].pts); } sort(CITY, CITY + N, [](City a, City b) { return a.ht < b.ht; }); for (int i = 1; i < N; ++i) { for (int j = 0; j < i; ++j) { int lat_diff = abs(CITY[i].lat - CITY[j].lat); int lon_diff = abs(CITY[i].lat - CITY[j].lat); if (lat_diff <= X && lon_diff <= Y) G[j].push_back(i); } } fill(SCORE, SCORE + N, INFI); for (int i = 0; i < N; ++i) { if (SCORE[i] <= INFI) find_score(i, -1); } Long reqd_score = INFI; for (int i = 0; i < N; ++i) reqd_score = max(reqd_score, SCORE[i]); printf("%lld\n", reqd_score); return 0; }