由于矩形边界不能算,那么考虑将星星平移$0.5$个单位,矩形长宽缩小$1$即可。
矩形左右边界分成两个四元组(x,y,y+h-1,c),(x+w,y,y+h-1,-c),按照$x$排序后,
转化为形如左端点$x$,是以$x$为左端点,$x+w-1$为右端点,询问每一个区间$[y_i,y_i+h-1]$的最大值。
修改操作就是对区间$[y,y+h-1]$加上一个权值。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define gc getchar()
using namespace std;
const int N=2e4+10;
inline void qr(int &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
void qw(int x)
{
    if(x<0)x=-x,putchar('-');
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
int arr[N],n,len,w,h;
void disc()
{
    len=0;
    sort(arr+1,arr+n+1);
    for(int i=1;i<=n;i++)
        if(i==1||arr[i-1]!=arr[i])arr[++len]=arr[i];
}
inline int get(int d)
{
    int l=1,r=len;
    while(l<r)
    {
        int mid=l+r>>1;
        if(arr[mid]<d)l=mid+1;
        else r=mid;
    }
    return l;
}
struct node{int x,y1,y2,c;bool operator <(const node a)const{return x<a.x;}}a[N];
struct Seg{int d,ad;}t[N<<2];
void pushdown(int p)
{
    if(t[p].ad)
    {
        int &ad=t[p].ad;
        t[p<<1].d+=ad;t[p<<1].ad+=ad;
        t[p<<1|1].d+=ad;t[p<<1|1].ad+=ad;
        ad=0;
    }
}
void build(int p,int l,int r)
{
    t[p].ad=t[p].d=0;
    if(l==r)return ;
    int mid=l+r>>1;build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
void change(int p,int l,int r,int ql,int qr,int ad)
{
    if(ql<=l&&qr>=r){t[p].ad+=ad,t[p].d+=ad;return ;}
    pushdown(p);int mid=l+r>>1;
    if(ql<=mid)change(p<<1,l,mid,ql,qr,ad);
    if(qr>mid)change(p<<1|1,mid+1,r,ql,qr,ad);
    t[p].d=max(t[p<<1].d,t[p<<1|1].d);
}
void solve()
{
    for(int i=1,x,y,c;i<=n;i++)
    {
        int k=i<<1;
        qr(x),qr(y),qr(c);
        a[k-1]=(node){x,y,y+h-1,c};a[k]=(node){x+w,y,y+h-1,-c};
        arr[k-1]=y,arr[k]=y+h-1;
    }
    n<<=1;
    sort(a+1,a+n+1);
    disc();
    build(1,1,len);
    for(int i=1;i<=n;i++)a[i].y1=get(a[i].y1),a[i].y2=get(a[i].y2);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        change(1,1,len,a[i].y1,a[i].y2,a[i].c);
        ans=max(ans,t[1].d);
    }
    qw(ans);puts("");
}
int main()
{
    while(scanf("%d%d%d",&n,&w,&h)!=EOF)solve();
    return 0;
}