#include using namespace std; //memset #define MEMSET_INF 127 // about 2B #define set0(a) memset(a,0,sizeof(a)); #define setminus1(a) memset(a,-1,sizeof(a)); #define setinf(a) memset(a,MEMSET_INF,sizeof(a)); //stl #define mp make_pair #define pb push_back //#define pc(x) putchar_unlocked(x) //#define gc() getchar_unlocked() //Loops #define REP(i,n) for(int i = 0;i < (int)(n); i++) #define REP1(i,a,b) for(int i = (int)(a);i <= (int)(b); i++) #define REPMAP(i,mm) for(auto i = mm.begin();i !=mm.end(); i++) //Sort #define sortvec(vec) sort(vec.begin(), vec.end()) //Misc #define LSOne(i) (i & (-i)) // the first Least Significant One-bit in i //modulo #define mod % #define NUM 1000000007 #define LONG_LONG_MAX 9223372036854775807LL #define LONG_LONG_MIN (-LONG_LONG_MAX-1) #define LMAX LONG_LONG_MAX #define LMIN LONG_LONG_MIN #define IMAX INT_MAX #define IMIN INT_MIN #define PI M_PI #define EPS 1e-9 #define INF 1e9 #define M_PI 3.14159265358979323846 #define cin(x) scanf("%d",&x) #define cout(x) printf("$d",x) #define endl '\n' #define s(n) scanf("%d",&n) #define sll(n) scanf("%I64d",&n) #define p(n) printf("%d",n) #define pll(n) printf("%I64d",n) #define all(v) (v).begin(),(v).end() //typedef typedef long long ll; typedef unsigned long long ull; typedef vector vi; typedef pair ii; typedef vector vii; typedef set si; typedef map msi; typedef map mii; typedef tuple iii; #define MAX_N 100005 #define MAX_VALUES 200005 #define LOG_N 18 struct Node{ Node *left, *right; ll value; Node(){ left = NULL; right = NULL; value = 0; } }; struct SegmentTree{ SegmentTree *left , *right; Node* pointToy; SegmentTree(){ left = NULL; right = NULL; pointToy = NULL; } }; class SegmentTree2{ SegmentTree *root; int maxx, maxy; public: void init(int _maxx, int _maxy){ root = new SegmentTree(); maxx = _maxx; maxy = _maxy; } void insertInTreeY(Node *node, int low, int high, int qy,ll val){ node->value = max(val,node->value); if(low == high){ return; } int m = (low + high)/2; if(qy <= m){ if(node->left == NULL){ node->left = new Node(); } insertInTreeY(node->left,low, m, qy,val); }else{ if(node->right == NULL){ node->right = new Node(); } insertInTreeY(node->right,m+1, high, qy,val); } } void insertInTreeX(SegmentTree *node, int low, int high, int qx, int qy,ll val){ if(node->pointToy == NULL){ node->pointToy = new Node(); } insertInTreeY(node->pointToy,0,maxy-1,qy,val); if(low == high){ return; } int m = (low + high)/2; if(qx <= m){ if(node->left == NULL){ node->left = new SegmentTree(); } insertInTreeX(node->left,low, m, qx, qy,val); }else{ if(node->right == NULL){ node->right = new SegmentTree(); } insertInTreeX(node->right,m+1, high, qx, qy,val); } } ll queryInTreeY(Node* node, int low,int high, int qylow, int y2){ ll ans = -1e18; if(node == NULL || y2 < low || qylow > high){ } else if(qylow <= low && y2 >= high){ ans = node->value; }else{ int m = (low + high)/2; ans = max(queryInTreeY(node->left,low,m,qylow,y2) , queryInTreeY(node->right,m+1,high,qylow,y2)); } return ans; } ll queryInTreeX(SegmentTree *node, int low, int high,int x1 , int x2, int y1, int y2){ ll ans = -1e18; if(node == NULL || x2 < low || x1 > high){ }else if(x1 <= low && x2 >= high){ ans = queryInTreeY(node->pointToy,0,maxy-1,y1 , y2); }else{ int m = (low + high)/2; ans = max(queryInTreeX(node->left,low,m,x1,x2,y1,y2) , queryInTreeX(node->right,m+1,high,x1,x2,y1,y2)); } return ans; } void update(int qx, int qy,ll val){ insertInTreeX(root,0, maxx-1, qx, qy, val); } ll query(int x1 , int x2, int y1, int y2){ return queryInTreeX(root, 0 , maxx-1 , x1, x2, y1, y2); } }; SegmentTree2 s; struct cities{ int x, y, hgt, pts; void get(){ cin>>x>>y>>hgt>>pts; x--, y--; } }; cities ar[200005]; void solve(){ int n, x, y; cin>>n>>x>>y; s.init(199999, 199999); REP( i ,n){ ar[i].get(); } sort(ar, ar + n, [](cities a, cities b){ return a.hgt < b.hgt; }); ll ans = 0; REP(i,n){ int x1,x2,y1,y2; x1 = max(ar[i].x - x , 0); x2 = min(ar[i].x + x , 199999); y1 = max(ar[i].y - y , 0); y2 = min(ar[i].y + y , 199999); ll tillnow = s.query(x1,x2,y1,y2); if(tillnow < 0 ) tillnow = 0; s.update(ar[i].x, ar[i].y,tillnow + ar[i].pts); ans = max(tillnow + ar[i].pts , ans); } cout<>TC; for(int ZZ=1;ZZ<=TC;ZZ++){ // cout<<"Case #"<