二维前缀和
/*
二维前缀和
m[i][j]:表示以[i][j]为右下顶点的所有点的和
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 5010;
int m[N][N]; // 二维前缀和数组,地图
int r; // 爆炸范围的边长
int n; // 目标数目
int res; // 价值
int main()
{
memset(m, 0, sizeof m);
scanf("%d%d", &n, &r);
r = min(r, 5001); // 确定范围
// 读入数据
for(int i = 1, x, y, w; i <= n; i++)
{
cin >> x >> y >> w;
m[x + 1][y + 1] += w;
}
// 初始化二维前缀和数组
for(int i = 1; i <= 5001; i++)
for(int j = 1; j <= 5001; j++)
m[i][j] = m[i - 1][j] + m[i][j - 1] - m[i - 1][j - 1] + m[i][j];
// 求最大价值
for(int i = r; i <= 5001; i++)
for(int j = r; j <= 5001; j++)
res = max(res, m[i][j] - m[i - r][j] - m[i][j - r] + m[i - r][j - r]);
cout << res << endl;
return 0;
}