求调送关。
#1 AC,#3-6 WA,其他 RE。
#include <bits/stdc++.h>
using namespace std;
// Wish CSP-J/S 2023 RP++!
struct sc {
int v, x;
}adder[10024], remover[10024];
int n,w,h,x[10024],y[10024],li[10024], as[20024], rs[20024], ac, rc;
long long seg[40024], lazy[40024];
int ves[20024], vss[20024], vt, vx;
int ed[20024], s[20024], mp[20024];
inline long long _max(long long _x, long long _y) {
return _x > _y ? _x : _y;
}
inline bool ecmp(int _x, int _y) {
return ed[_x] < ed[_y];
}
inline bool vcmp(int _x, int _y) {
return ves[_x] < ves[_y];
}
inline void pushdown(int id) {
seg[id] += lazy[id];
lazy[id<<1] += lazy[id];
lazy[id<<1|1] += lazy[id];
lazy[id] = 0;
}
inline void rmlazy(int id) {
seg[id] += lazy[id];
lazy[id] = 0;
}
void Modify(int id, int l, int r, int L, int R, int val) {
if(L == R) {
if(lazy[id]) {
rmlazy(id);
}
seg[id] += val;
return;
}
if(lazy[id]) {
pushdown(id);
}
if(l<=L&&R<=r) {
lazy[id] = val;
pushdown(id);
return;
}
int mid = (L+R) >> 1;
if(l <= mid) {
Modify(id<<1, l, r, L, mid, val);
}
if(r>mid) {
Modify(id<<1|1, l, r, mid + 1, R, val);
}
seg[id] = _max(seg[id<<1], seg[id<<1|1]);
}
int main() {
#ifdef _PDEBUG_
freopen("1502.in", "r", stdin);
freopen("1502.out", "w", stdout);
#endif
int t;
int _k = 0, _p = -1;
scanf("%d" ,&t);
while(t--) {
vx = 0;
vt = -1;
ac = 0;
rc = 0;
memset(seg, 0, sizeof(seg));
memset(lazy, 0, sizeof(lazy));
memset(as, -1, sizeof(as));
memset(rs, -1, sizeof(rs));
scanf("%d %d %d", &n, &w, &h);
for(int i=1;i<=n;i++) {
scanf("%d %d %d", x+i, y+i, li+i);
ed[i<<1] = x[i];
ed[i<<1|1] = x[i] + w - 1;
ves[i<<1] = y[i];
ves[i<<1|1] = y[i] + h;
s[i<<1] = i<<1;
s[i<<1|1] = i<<1|1;
vss[i<<1] = i<<1;
vss[i<<1|1] = i<<1|1;
}
sort(s + 2, s + ((n + 1) << 1), ecmp);
sort(vss + 2, vss + ((n+1) << 1), vcmp);
for(int i=2;i<(n+1)<<1;i++) {
if(ed[s[i]] != _p) {
_p = ed[s[i]];
_k++;
}
mp[s[i]] = _k;
}
for(int i = 2; i < (n+1)<<1; i++) {
if(ves[i] != vt) {
vt = ves[i];
vx++;
}
if(vss[i]&1) {
remover[rc].v=vss[i]>>1;
remover[rc].x=rs[vx];
rs[vx] = rc;
rc++;
}else {
adder[ac].v=vss[i]>>1;
adder[ac].x=as[vx];
as[vx]=ac;
ac++;
}
}
long long ans = 0;
for(int i=1;i<=vx;i++) {
int _nx = as[i];
while(~_nx) {
Modify(1, mp[adder[_nx].v<<1], mp[adder[_nx].v<<1|1], 1, _k, li[adder[_nx].v]);
_nx = adder[_nx].x;
}
_nx = rs[i];
while(~_nx) {
Modify(1, mp[remover[_nx].v<<1], mp[remover[_nx].v<<1|1], 1, _k, -li[remover[_nx].v]);
_nx = remover[_nx].x;
}
ans = _max(ans, seg[1]);
}
printf("%lld\n", ans);
}
return 0;
}