#include #include #include using std::max; const int N = 2e5 + 10, V = 2e7; struct C{ int x, y, h, p; bool operator<(const C& b) {return h < b.h;} void rd() { scanf("%d%d%d%d", &x, &y,&h, &p); } }ci[N]; int n, dx, dy, st[V], ch[V][2], mx[V], sz, id[V], rt; int q1, q2, q3, q4; long long f[N], ans; void ich(int& o, int l, int r) { if (!o) o = ++sz; if (l == r) { mx[o] = max(mx[o], q3); return; } int mid = l + r >> 1; if (q2 <= mid) ich(ch[o][0], l, mid); else ich(ch[o][1], mid + 1, r); mx[o] = max(mx[ch[o][0]], mx[ch[o][1]]); } void och(int& o, int l, int r) { if (!o) o = ++sz; ich(id[o], 1, 2e5); if (l == r) return; int mid = l + r >> 1; if (q1 <= mid) och(ch[o][0], l, mid); else och(ch[o][1], mid + 1, r); } int iqu(int o, int l, int r) { if (!o) return 0; if (q3 <= l && r <= q4) return mx[o]; int mid = l + r >> 1, s = 0; if (q3 <= mid) s = max(s, iqu(ch[o][0], l, mid)); if (mid < q4) s = max(s, iqu(ch[o][1], mid + 1, r)); return s; } int oqu(int o, int l, int r) { if (!o) return 0; if (q1 <= l && r <= q2) return iqu(id[o], 1, 2e5); int mid = l + r >> 1, s = 0; if (q1 <= mid) s = max(s, oqu(ch[o][0], l, mid)); if (mid < q2) s = max(s, oqu(ch[o][1], mid + 1, r)); return s; } int main() { // freopen("input", "r", stdin); scanf("%d%d%d", &n, &dx, &dy); memset(mx, 0xc0, sizeof(mx)); for (int i = 1; i <= n; i++) ci[i].rd(); std::sort(ci + 1, ci + 1 + n); for (int i = n; i >= 1; i--) { f[i] += ci[i].p; q1 = ci[i].x - dx, q2 = ci[i].x + dx; q3 = ci[i].y - dy, q4 = ci[i].y + dy; f[i] += oqu(rt, 1, 2e5); if (ci[i - 1].h != ci[i].h) for (int j = i; j <= n && ci[j].h == ci[i].h; j++) q1 = ci[j].x, q2 = ci[j].y, q3 = f[j], och(rt, 1, 2e5); // printf("f[%d]: %lld\n", i, f[i]); ans = max(ans, f[i]); } printf("%lld", ans); }