#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF 1e+9 #define mp make_pair #define pb push_back #define fi first #define fs first #define se second #define i64 long long #define li long long #define lint long long #define pii pair #define vi vector #define forn(i, n) for (int i = 0; i < (int)n; i++) #define fore(i, b, e) for (int i = (int)b; i <= (int)e; i++) const int maxn = 2e5+5; i64 dp[maxn]; int dx, dy, n; pii order[maxn]; int points[maxn]; int x[maxn]; int y[maxn]; pii xorder[maxn]; int h[maxn]; int main() { #ifdef LOCAL freopen("inp", "r", stdin); //freopen("outp", "w", stdout); #else // freopen(TASKNAME ".in", "r", stdin); // freopen(TASKNAME ".out", "w", stdout); #endif scanf("%d%d%d", &n, &dx, &dy); forn(i, n) { scanf("%d%d%d%d", &x[i], &y[i], &h[i], &points[i]); order[i] = mp(h[i], i); xorder[i] = mp(x[i], i); } sort(order, order + n); sort(xorder, xorder + n); forn(i, n) { int numi = order[i].se; dp[numi] = points[numi]; i64 maxx = 0; int lower = lower_bound(xorder, xorder + n, mp(x[numi] - dx, -1)) - xorder; int upper = upper_bound(xorder + lower, xorder + n, mp(x[numi] + dx, n)) - xorder; fore(j, lower, upper - 1) { int numj = xorder[j].se; if (h[numj] < h[numi] && numi != numj && abs(y[numj] - y[numi]) <= dy) maxx = max(maxx, dp[numj]); } dp[numi] += maxx; } i64 ans = 0; forn(i, n) ans = max(ans, dp[i]); cout << ans; }