#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<cmath>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MAX 30010using namespace std;class line{public: long long x,y1,y2; int flag; line(){} line(long long a ,long long b, long long c, int d):x(a),y1(b),y2(c),flag(d) {} bool operator <(const line b)const { if(x!=b.x) return x<b.x; return flag>b.flag; }}lines[MAX*2];long long cy[MAX*2];struct node{ int l,r,cover,max;}a[MAX*3];void build(int t ,int l, int r){ a[t].l=l; a[t].r=r; a[t].cover=0; a[t].max=0; if(l==r)return; int mid=(l+r)>>1; build(L(t),l,mid); build(R(t),mid+1,r);}void update(int t,line s){ if(s.y1<=cy[a[t].l]&&cy[a[t].r]<=s.y2) { a[t].cover+=s.flag; a[t].max+=s.flag; return; } if(a[t].l==a[t].r)return; a[L(t)].cover+=a[t].cover; a[L(t)].max+=a[t].cover; a[R(t)].cover+=a[t].cover; a[R(t)].max+=a[t].cover; a[t].cover=0; int mid=(a[t].l+a[t].r)>>1; if(s.y1<=cy[mid]) update(L(t),s); if(s.y2>cy[mid]) update(R(t),s); a[t].max=max(a[L(t)].max,a[R(t)].max);}int main(){ int m,i,val; long long w,h,x,y; int numl,numy; int ans; while(scanf("%d%lld%lld",&m,&w,&h)!=EOF) { if(w==0||h==0) { printf("0\n"); continue; } numl=0; numy=0; ans=0; while(m--) { scanf("%lld%lld%d",&x,&y,&val); lines[numl++]=line(x,y,y+h-1,val); lines[numl++]=line(x+w-1,y,y+h-1,-val); cy[numy++]=y; cy[numy++]=y+h-1; } sort(cy,cy+numy); sort(lines,lines+numl); numy=unique(cy,cy+numy)-cy; build(1,0,numy-1); for(i=0;i<numl;i++) { update(1,lines[i]); ans=max(ans,a[1].max); } printf("%d\n",ans); }}