#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Event {
int y1, y2; // đoạn [y1, y2] (theo chỉ số đã nén)
ll v; // +wi hoặc -wi
};
struct SegTree {
int n;
vector<ll> mx, lazy;
SegTree(int n = 0) { init(n); }
void init(int n_) {
n = n_;
mx.assign(4 * n + 5, 0);
lazy.assign(4 * n + 5, 0);
}
void push(int id) {
if (lazy[id] == 0) return;
ll v = lazy[id];
int L = id << 1, R = L | 1;
mx[L] += v; lazy[L] += v;
mx[R] += v; lazy[R] += v;
lazy[id] = 0;
}
void upd(int id, int l, int r, int u, int v, ll val) {
if (u > r || v < l) return;
if (u <= l && r <= v) {
mx[id] += val;
lazy[id] += val;
return;
}
push(id);
int mid = (l + r) >> 1;
upd(id << 1, l, mid, u, v, val);
upd(id << 1 | 1, mid + 1, r, u, v, val);
mx[id] = max(mx[id << 1], mx[id << 1 | 1]);
}
void upd(int l, int r, ll val) {
if (l > r) return;
upd(1, 0, n - 1, l, r, val);
}
ll getMax() const {
return mx[1];
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
ll W, H;
if (!(cin >> N >> W >> H)) return 0;
--H; --W;
vector<ll> xi(N), yi(N), wi(N);
vector<ll> xs, ys;
xs.reserve(2 * N + 5);
ys.reserve(2 * N + 5);
for (int i = 0; i < N; ++i) {
cin >> xi[i] >> yi[i] >> wi[i];
ll lx = xi[i] - W;
ll rx = xi[i];
ll ly = yi[i] - H;
ll ry = yi[i];
// lưu lại các biên để ép tọa độ
xs.push_back(lx);
xs.push_back(rx + 1); // +1 để làm biên phải mở
ys.push_back(ly);
ys.push_back(ry + 1);
// tiện thì ghi đè lại luôn
xi[i] = lx;
yi[i] = ly;
// ta sẽ dùng (lx, rx, ly, ry) từ các biến tạm sau
}
// ép tọa độ X
sort(xs.begin(), xs.end());
xs.erase(unique(xs.begin(), xs.end()), xs.end());
int nx = xs.size();
// ép tọa độ Y
sort(ys.begin(), ys.end());
ys.erase(unique(ys.begin(), ys.end()), ys.end());
int ny = (int)ys.size() - 1; // số đoạn [ys[j], ys[j+1])
vector<vector<Event>> ev(nx); // ev[ix] = danh sách event tại X chỉ số ix
for (int i = 0; i < N; ++i) {
ll lx = xi[i]; // đã là xi[i] - W
ll rx = lx + W; // thực ra = xi gốc
ll ly = yi[i]; // = yi gốc - H
ll ry = ly + H; // = yi gốc
ll w = wi[i];
int ix1 = lower_bound(xs.begin(), xs.end(), lx) - xs.begin();
int ix2 = lower_bound(xs.begin(), xs.end(), rx + 1) - xs.begin(); // biên phải mở
int iy1 = lower_bound(ys.begin(), ys.end(), ly) - ys.begin();
int iy2 = lower_bound(ys.begin(), ys.end(), ry + 1) - ys.begin() - 1; // đoạn [iy1, iy2]
if (iy1 > iy2) continue; // đề cho H >= 1 nên thường không xảy ra
ev[ix1].push_back({iy1, iy2, w});
if (ix2 < nx)
ev[ix2].push_back({iy1, iy2, -w});
}
SegTree st(ny);
ll ans = 0;
for (int ix = 0; ix < nx; ++ix) {
// xử lý tất cả sự kiện tại X này
for (const auto &e : ev[ix]) {
st.upd(e.y1, e.y2, e.v);
}
// sau khi cập nhật, max trên trục Y là đáp án nếu đặt X trong đoạn này
ans = max(ans, st.getMax());
}
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCnN0cnVjdCBFdmVudCB7CiAgICBpbnQgeTEsIHkyOyAvLyDEkW/huqFuIFt5MSwgeTJdICh0aGVvIGNo4buJIHPhu5EgxJHDoyBuw6luKQogICAgbGwgdjsgICAgICAgLy8gK3dpIGhv4bq3YyAtd2kKfTsKCnN0cnVjdCBTZWdUcmVlIHsKICAgIGludCBuOwogICAgdmVjdG9yPGxsPiBteCwgbGF6eTsKCiAgICBTZWdUcmVlKGludCBuID0gMCkgeyBpbml0KG4pOyB9CgogICAgdm9pZCBpbml0KGludCBuXykgewogICAgICAgIG4gPSBuXzsKICAgICAgICBteC5hc3NpZ24oNCAqIG4gKyA1LCAwKTsKICAgICAgICBsYXp5LmFzc2lnbig0ICogbiArIDUsIDApOwogICAgfQoKICAgIHZvaWQgcHVzaChpbnQgaWQpIHsKICAgICAgICBpZiAobGF6eVtpZF0gPT0gMCkgcmV0dXJuOwogICAgICAgIGxsIHYgPSBsYXp5W2lkXTsKICAgICAgICBpbnQgTCA9IGlkIDw8IDEsIFIgPSBMIHwgMTsKICAgICAgICBteFtMXSArPSB2OyBsYXp5W0xdICs9IHY7CiAgICAgICAgbXhbUl0gKz0gdjsgbGF6eVtSXSArPSB2OwogICAgICAgIGxhenlbaWRdID0gMDsKICAgIH0KCiAgICB2b2lkIHVwZChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBsbCB2YWwpIHsKICAgICAgICBpZiAodSA+IHIgfHwgdiA8IGwpIHJldHVybjsKICAgICAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgICAgICBteFtpZF0gKz0gdmFsOwogICAgICAgICAgICBsYXp5W2lkXSArPSB2YWw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcHVzaChpZCk7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICB1cGQoaWQgPDwgMSwgbCwgbWlkLCB1LCB2LCB2YWwpOwogICAgICAgIHVwZChpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgdSwgdiwgdmFsKTsKICAgICAgICBteFtpZF0gPSBtYXgobXhbaWQgPDwgMV0sIG14W2lkIDw8IDEgfCAxXSk7CiAgICB9CgogICAgdm9pZCB1cGQoaW50IGwsIGludCByLCBsbCB2YWwpIHsKICAgICAgICBpZiAobCA+IHIpIHJldHVybjsKICAgICAgICB1cGQoMSwgMCwgbiAtIDEsIGwsIHIsIHZhbCk7CiAgICB9CgogICAgbGwgZ2V0TWF4KCkgY29uc3QgewogICAgICAgIHJldHVybiBteFsxXTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgTjsKICAgIGxsIFcsIEg7CiAgICBpZiAoIShjaW4gPj4gTiA+PiBXID4+IEgpKSByZXR1cm4gMDsKICAgIC0tSDsgLS1XOwoKICAgIHZlY3RvcjxsbD4geGkoTiksIHlpKE4pLCB3aShOKTsKICAgIHZlY3RvcjxsbD4geHMsIHlzOwogICAgeHMucmVzZXJ2ZSgyICogTiArIDUpOwogICAgeXMucmVzZXJ2ZSgyICogTiArIDUpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CiAgICAgICAgY2luID4+IHhpW2ldID4+IHlpW2ldID4+IHdpW2ldOwoKICAgICAgICBsbCBseCA9IHhpW2ldIC0gVzsKICAgICAgICBsbCByeCA9IHhpW2ldOwogICAgICAgIGxsIGx5ID0geWlbaV0gLSBIOwogICAgICAgIGxsIHJ5ID0geWlbaV07CgogICAgICAgIC8vIGzGsHUgbOG6oWkgY8OhYyBiacOqbiDEkeG7gyDDqXAgdOG7jWEgxJHhu5kKICAgICAgICB4cy5wdXNoX2JhY2sobHgpOwogICAgICAgIHhzLnB1c2hfYmFjayhyeCArIDEpOyAvLyArMSDEkeG7gyBsw6BtIGJpw6puIHBo4bqjaSBt4bufCiAgICAgICAgeXMucHVzaF9iYWNrKGx5KTsKICAgICAgICB5cy5wdXNoX2JhY2socnkgKyAxKTsKCiAgICAgICAgLy8gdGnhu4duIHRow6wgZ2hpIMSRw6ggbOG6oWkgbHXDtG4KICAgICAgICB4aVtpXSA9IGx4OwogICAgICAgIHlpW2ldID0gbHk7CiAgICAgICAgLy8gdGEgc+G6vSBkw7luZyAobHgsIHJ4LCBseSwgcnkpIHThu6sgY8OhYyBiaeG6v24gdOG6oW0gc2F1CiAgICB9CgogICAgLy8gw6lwIHThu41hIMSR4buZIFgKICAgIHNvcnQoeHMuYmVnaW4oKSwgeHMuZW5kKCkpOwogICAgeHMuZXJhc2UodW5pcXVlKHhzLmJlZ2luKCksIHhzLmVuZCgpKSwgeHMuZW5kKCkpOwogICAgaW50IG54ID0geHMuc2l6ZSgpOwoKICAgIC8vIMOpcCB04buNYSDEkeG7mSBZCiAgICBzb3J0KHlzLmJlZ2luKCksIHlzLmVuZCgpKTsKICAgIHlzLmVyYXNlKHVuaXF1ZSh5cy5iZWdpbigpLCB5cy5lbmQoKSksIHlzLmVuZCgpKTsKICAgIGludCBueSA9IChpbnQpeXMuc2l6ZSgpIC0gMTsgLy8gc+G7kSDEkW/huqFuIFt5c1tqXSwgeXNbaisxXSkKCiAgICB2ZWN0b3I8dmVjdG9yPEV2ZW50Pj4gZXYobngpOyAvLyBldltpeF0gPSBkYW5oIHPDoWNoIGV2ZW50IHThuqFpIFggY2jhu4kgc+G7kSBpeAoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CiAgICAgICAgbGwgbHggPSB4aVtpXTsgICAgICAgIC8vIMSRw6MgbMOgIHhpW2ldIC0gVwogICAgICAgIGxsIHJ4ID0gbHggKyBXOyAgICAgICAvLyB0aOG7sWMgcmEgPSB4aSBn4buRYwogICAgICAgIGxsIGx5ID0geWlbaV07ICAgICAgICAvLyA9IHlpIGfhu5FjIC0gSAogICAgICAgIGxsIHJ5ID0gbHkgKyBIOyAgICAgICAvLyA9IHlpIGfhu5FjCgogICAgICAgIGxsIHcgPSB3aVtpXTsKCiAgICAgICAgaW50IGl4MSA9IGxvd2VyX2JvdW5kKHhzLmJlZ2luKCksIHhzLmVuZCgpLCBseCkgLSB4cy5iZWdpbigpOwogICAgICAgIGludCBpeDIgPSBsb3dlcl9ib3VuZCh4cy5iZWdpbigpLCB4cy5lbmQoKSwgcnggKyAxKSAtIHhzLmJlZ2luKCk7IC8vIGJpw6puIHBo4bqjaSBt4bufCgogICAgICAgIGludCBpeTEgPSBsb3dlcl9ib3VuZCh5cy5iZWdpbigpLCB5cy5lbmQoKSwgbHkpIC0geXMuYmVnaW4oKTsKICAgICAgICBpbnQgaXkyID0gbG93ZXJfYm91bmQoeXMuYmVnaW4oKSwgeXMuZW5kKCksIHJ5ICsgMSkgLSB5cy5iZWdpbigpIC0gMTsgLy8gxJFv4bqhbiBbaXkxLCBpeTJdCgogICAgICAgIGlmIChpeTEgPiBpeTIpIGNvbnRpbnVlOyAvLyDEkeG7gSBjaG8gSCA+PSAxIG7Dqm4gdGjGsOG7nW5nIGtow7RuZyB44bqjeSByYQoKICAgICAgICBldltpeDFdLnB1c2hfYmFjayh7aXkxLCBpeTIsIHd9KTsKICAgICAgICBpZiAoaXgyIDwgbngpCiAgICAgICAgICAgIGV2W2l4Ml0ucHVzaF9iYWNrKHtpeTEsIGl5MiwgLXd9KTsKICAgIH0KCiAgICBTZWdUcmVlIHN0KG55KTsKICAgIGxsIGFucyA9IDA7CgogICAgZm9yIChpbnQgaXggPSAwOyBpeCA8IG54OyArK2l4KSB7CiAgICAgICAgLy8geOG7rSBsw70gdOG6pXQgY+G6oyBz4buxIGtp4buHbiB04bqhaSBYIG7DoHkKICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmUgOiBldltpeF0pIHsKICAgICAgICAgICAgc3QudXBkKGUueTEsIGUueTIsIGUudik7CiAgICAgICAgfQogICAgICAgIC8vIHNhdSBraGkgY+G6rXAgbmjhuq10LCBtYXggdHLDqm4gdHLhu6VjIFkgbMOgIMSRw6FwIMOhbiBu4bq/dSDEkeG6t3QgWCB0cm9uZyDEkW/huqFuIG7DoHkKICAgICAgICBhbnMgPSBtYXgoYW5zLCBzdC5nZXRNYXgoKSk7CiAgICB9CgogICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgIHJldHVybiAwOwp9Cg==