#include using namespace std; // why am I so weak #include using namespace std; // dynamic segment tree from http://ideone.com/0QK4CX struct node; node *newNode(); struct node { int lv, rv; long long sum = 0ll; node *left, *right; node() : left(NULL), right(NULL), sum(0) {} inline void init(int l, int r) { lv = l; rv = r; } inline void extend() { if (!left) { int m = (lv + rv) / 2; left = newNode(); right = newNode(); left->init(lv, m); right->init(m + 1, rv); } } long long query(int l, int r) { if (r < lv || rv < l) { return 0; } if (l <= lv && rv <= r) { return sum; } extend(); return max(left->query(l, r), right->query(l, r)); } void update(int p, long long newVal) { if (lv == rv) { sum = max(sum, newVal); return; } extend(); (p <= left->rv ? left : right)->update(p, newVal); sum = max(left->sum, right->sum); } }; node *newNode() { static int bufSize = 1e7; static node buf[(int) 1e7]; return &buf[--bufSize]; } int n, x, y; struct city {int lat; int lon; int h; int pt;}; long long high[200055]; node *dat[400055]; long long query(int l, int r, int x, int y) { l += (int)2e5, r += (int)2e5; long long res = 0ll; for (; l < r; l >>= 1, r >>= 1) { if (l & 1) res = max(res, dat[l++]->query(x, y)); if (r & 1) res = max(res, dat[--r]->query(x, y)); } return res; } void update(int x, int y, long long val) { x += (int)2e5; for (; x > 0; x >>= 1) { dat[x]->update(y, val); } } int main() { scanf("%d %d %d", &n, &x, &y); vector vec(n); for (int i = 0; i < n; i++) { int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); vec[i] = (city){a, b, c, d}; } sort(vec.begin(), vec.end(), [&] (city u, city v) { return u.h < v.h; }); for (int i = 1; i <= (int)4e5 + 10; i++) { dat[i] = newNode(); dat[i]->init(1, (int)2e5); } long long res = 0ll; for (int i = 0; i < n; i++) { if (i && vec[i].h != vec[i - 1].h) { for (int j = i - 1; j >= 0 && vec[j].h == vec[i - 1].h; j--) { update(vec[j].lat, vec[j].lon, high[j]); } } high[i] = query(max(1, vec[i].lat - x), min((int)2e5, vec[i].lat + x) + 1, max(1, vec[i].lon - y), min((int)2e5, vec[i].lon + y) + 1) + vec[i].pt; res = max(res, high[i]); } printf("%lld\n", res); return 0; }