#include <bits/stdc++.h>
using namespace std;
int n, p, q, r, now;
int a[500050], b[500050], c[500050], id[500050], mxx[500050], mxy[500050];
long long ans;
struct seg {
  int mark[500050 << 2], mx[500050 << 2], mn[500050 << 2];
  long long sum[500050 << 2];
  void push_up(int id) {
    sum[id] = sum[id << 1] + sum[id << 1 | 1];
    mx[id] = max(mx[id << 1], mx[id << 1 | 1]);
    mn[id] = min(mn[id << 1], mn[id << 1 | 1]);
  }
  void make_con(int l, int r, int id, int val) {
    mark[id] = val;
    sum[id] = 1ll * val * (r - l + 1);
    mx[id] = mn[id] = val;
  }
  void push_down(int l, int r, int id) {
    if (mark[id]) {
      int m = l + r >> 1;
      make_con(l, m, id << 1, mark[id]);
      make_con(m + 1, r, id << 1 | 1, mark[id]);
      mark[id] = 0;
    }
  }
  void modify(int L, int R, int val, int l, int r, int id) {
    if (r < L || R < l) return;
    if (L <= l && r <= R) {
      make_con(l, r, id, val);
      return;
    }
    push_down(l, r, id);
    int m = l + r >> 1;
    modify(L, R, val, l, m, id << 1);
    modify(L, R, val, m + 1, r, id << 1 | 1);
    push_up(id);
  }
  long long sumquery(int L, int R, int l, int r, int id) {
    if (r < L || R < l) return 0;
    if (L <= l && r <= R) {
      return sum[id];
    }
    push_down(l, r, id);
    int m = l + r >> 1;
    return sumquery(L, R, l, m, id << 1) +
           sumquery(L, R, m + 1, r, id << 1 | 1);
  }
  int lquery(int val, int l, int r, int id) {
    if (l == r) return l;
    push_down(l, r, id);
    int m = l + r >> 1;
    if (mn[id << 1] < val) return lquery(val, l, m, id << 1);
    return lquery(val, m + 1, r, id << 1 | 1);
  }
  int rquery(int val, int l, int r, int id) {
    if (l == r) return l;
    push_down(l, r, id);
    int m = l + r >> 1;
    if (mx[id << 1 | 1] >= val) return rquery(val, m + 1, r, id << 1 | 1);
    return rquery(val, l, m, id << 1);
  }
} ST;
bool cmp(int x, int y) { return a[x] < a[y]; }
void modify(int x, int y) {
  if (ST.mn[1] >= y) return;
  int l = ST.lquery(y, 1, q, 1);
  if (l <= x) ST.modify(l, x, y, 1, q, 1);
}
long long query(int x, int y) {
  long long rtn = 1ll * (q - x + 1) * (r - y + 1);
  if (ST.mx[1] < y) return rtn;
  int r = ST.rquery(y, 1, q, 1);
  if (x <= r) rtn -= ST.sumquery(x, r, 1, q, 1) - 1ll * (r - x + 1) * (y - 1);
  return rtn;
}
int main() {
  scanf("%d %d %d %d", &n, &p, &q, &r);
  for (int i = 0; i < n; i++) {
    scanf("%d %d %d", &a[i], &b[i], &c[i]);
    id[i] = i;
  }
  sort(id, id + n, cmp);
  mxx[n] = mxy[n] = 1;
  for (int i = n - 1; i >= 0; i--) {
    mxx[i] = max(mxx[i + 1], b[id[i]] + 1);
    mxy[i] = max(mxy[i + 1], c[id[i]] + 1);
  }
  for (int i = 1; i <= p; i++) {
    while (now < n && a[id[now]] < i) modify(b[id[now]], c[id[now]]), now++;
    ans += query(mxx[now], mxy[now]);
  }
  printf("%I64d\n", ans);
}
