#include<bits/stdc++.h>
using namespace std;
const int N = 16e5 + 5;
int T, n, w, h, X[N];
struct Line{ int x1, x2, y, tag, val; }L[N];
struct Seg{ int l, r, val, cnt; }tr[N];
bool cmp(Line a, Line b){ return a.y < b.y; }
void build(int p, int s, int t){
tr[p] = { s, t, 0, 0 };
if(s == t) return;
int mid = (s + t) / 2;
build(p*2, s, mid);
build(p*2+1, mid+1, t);
}
void pushup(int p, int v){
if(tr[p].cnt) tr[p].val += v;
else tr[p].val = max(tr[p*2].val, tr[p*2+1].val);
}
void modify(int p, int l, int r, int tag, int v){
if(l > tr[p].r || r < tr[p].l) return;
if(l <= tr[p].l && tr[p].r <= r){
tr[p].cnt += tag;
pushup(p, v);
return;
}
modify(p*2, l, r, tag, v);
modify(p*2+1, l, r, tag, v);
pushup(p, v);
}
int main(){
scanf("%d", &T);
while(T--){
int ans = 0;
scanf("%d%d%d", &n, &w, &h);
for(int i = 1; i <= n; i++){
int x, y, v;
scanf("%d%d%d", &x, &y, &v);
X[i] = x; X[i+n] = x+w-1;
L[i] = { x, x+w-1, y, 1, v };
L[i+n] = { x, x+w-1, y+h-1, -1, -v };
}
sort(L+1, L+2*n+1, cmp);
sort(X+1, X+2*n+1);
int m = unique(X+1, X+2*n+1) - X-1;
build(1, 1, m-1);
for(int i = 1; i < 2*n; i++){
int l = lower_bound(X+1, X+2*n+1, L[i].x1) - X;
int r = lower_bound(X+1, X+2*n+1, L[i].x2) - X;
modify(1, l, r-1, L[i].tag, L[i].val);
ans = max(ans, tr[1].val);
}
printf("%d\n", ans);
}
return 0;
}
我自己对右端点偏移映射不太确定,可能有错,望各位大佬指出orz