#include using namespace std; const long minVal = -40000000001; vector> cities; vector memoMax(200000, minVal); int x,y,n; long sol(int start){ long currScore = get<3>(cities[start]); if(memoMax[start] > minVal) return memoMax[start]; if(start==n-1) return currScore; // We need to go through the rest of the cities and find the // max for them long score = 0; //long tmpScore = currScore; for(int i = start+1; i < n; i++){ if(abs(get<1>(cities[start])-get<1>(cities[i])) <= x & abs(get<2>(cities[start])-get<2>(cities[i])) <= y){ score = sol(i)+currScore; if(score > currScore) currScore = score; } } memoMax[start] = currScore; return currScore; } int main(){ cin >> n >> x >> y; vector memoMax(n,minVal); for(int a0 = 0; a0 < n; a0++){ int latitude; int longitude; int height; int points; cin >> latitude >> longitude >> height >> points; cities.emplace_back(make_tuple(height,latitude,longitude,points)); } sort(cities.begin(),cities.end()); // Fill the memoMax backwards long myMax = minVal; long tmpMax; for(int i = n-1; i >= 0; i--){ tmpMax = sol(i); if(tmpMax > myMax) myMax = tmpMax; } cout << myMax << endl; return 0; }