只对了 #1
Code
#include <iostream>
#include <algorithm>
#define PP pair <pair <int, int>, int>
#define int long long
#define ls p << 1
#define rs p << 1 | 1
#define X first.first
#define Y first.second
#define L second
using namespace std;
const int N = 1e4 + 10;
PP f[N]; int n, w, h, p[N << 1], cnt;
int rd() {
int res = 0; bool f = 0; char ch = getchar();
while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9') res = (res << 1) + (res << 3) + (ch ^ 48), ch = getchar();
return f ? -res : res;
}
struct SegmentTree { int l, r, Max, add; } t[N << 3];
void pushdown(int p) { t[ls].Max += t[p].add, t[rs].Max += t[p].add, t[ls].add += t[p].add, t[rs].add += t[p].add, t[p].add = 0; }
void pushup(int p) { t[p].Max = max(t[ls].Max, t[rs].Max); }
void build(int p, int l, int r) {
t[p] = {l, r, 0, 0};
if (l == r) return ;
int mid = l + r >> 1;
build(ls, l, mid), build(rs, mid + 1, r);
}
void update(int p, int l, int r, int k) {
if (l <= t[p].l && t[p].r <= r) {
t[p].Max += k, t[p].add += k;
return ;
}
int mid = t[p].l + t[p].r >> 1; pushdown(p);
if (l <= mid) update(ls, l, r, k);
if (r > mid) update(rs, l, r, k);
pushup(p);
}
int query(int p, int l, int r) {
if (l <= t[p].l && t[p].r <= r) return t[p].Max;
int mid = t[p].l + t[p].r >> 1, res = 0; pushdown(p);
if (l <= mid) res = max(res, query(ls, l, r));
if (r > mid) res = max(res, query(rs, l, r));
return res;
}
int lb(int x) {
int l = 0, r = cnt + 1;
while (l + 1 < r) {
int mid = l + r >> 1;
if (p[mid] >= x) r = mid;
else l = mid;
}
return r;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
int T = rd();
while (T --) {
n = rd(), w = rd(), h = rd(), cnt = 0;
for (int i = 1, x, y, l; i <= n; ++ i) x = rd(), y = rd(), l = rd(), f[i] = make_pair(make_pair(x, y), l), p[++ cnt] = y, p[++ cnt] = y + w;
sort(f + 1, f + n + 1); sort(p + 1, p + cnt + 1); cnt = unique(p + 1, p + cnt + 1) - p - 1;
build(1, 1, cnt); int ans = 0;
for (int l = 1, r = 0; r <= n; ++ r) {
if (l > 1) update(1, lb(f[l - 1].Y), lb(f[l - 1].Y + w), -f[l - 1].L);
while (r < n && f[r + 1].X - f[l].X <= h) ++ r, update(1, lb(f[r].Y), lb(f[r].Y + w), f[r].L);
ans = max(ans, query(1, 1, cnt));
}
cout << ans << '\n';
}
return 0;
}