#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <algorithm>
#include <cmath>
#include <climits>
#ifdef DEBUG
#include <ctime>
#endif
using namespace std;
// template
// abbreviations
#define vi vector<int>
#define vl vector<ll>
#define vb vector<bool>
#define vs vector<string>
#define ii pair<int, int>
#define a first
#define b second
#define vii vector<ii>
#define mii map<ii>
#define vvi vector<vi>
#define vvl vector<vl>
#define que queue
#define pque priority_queue
#define stk stack
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define pu push
#define po pop
#define mp make_pair
#define sz(var) ((int) var.size())
#define rep(it, n) for(int it = 0; it < n; ++it)
#define dep(it, n) for(int it = n - 1; it >= 0; --it)
#define rep1(it, n) for(int it = 1; it <= n; ++it)
#define dep1(it, n) for(int it = n; it > 0; --it)
#define loop(it, from, to) for(int it = (from); it <= (to); ++it)
#define iter(it, cont) for(__typeof((cont).begin()) it = (cont).begin(); it != (cont).end(); ++it)
#define riter(it, cont) for(__typeof((cont).rbegin()) it = (cont).rbegin(); it != (cont).rend(); ++it)
#define all(cont) (cont).begin(), (cont).end()
#define rng(cont, n) cont, cont + n
#define memclr(var) memset(var, 0, sizeof(var))
typedef unsigned long long ull;
typedef long long ll;
const int INF = INT_MAX;
const int NINF = INT_MIN;
const ll INF_LL = LLONG_MAX;
const ll NINF_LL = LLONG_MIN;
const double PI = acos(-1.0);
const int MOD = 1e9 + 7;
#ifdef DEBUG
#define debug(fmt, args...) printf("Line %d, in %s\t: " fmt, __LINE__, __FUNCTION__, ##args)
#define rep_rt() printf("[Run time: %.3fs]\n", ((double) clock()) / CLOCKS_PER_SEC)
#else
#define debug(...)
#endif
// end of template
#ifdef __WIN32
#define gc getchar
#define pc putchar
#else
#define gc getchar_unlocked
#define pc putchar_unlocked
#endif
#define MAX_DIGIT_int 10
#define MAX_DIGIT_ll 19
#define FS_INT_TYPE(type) \
void fsi(type &inp) { \
register char c = gc(), prev = '+'; \
for (; !isdigit(c); c = gc()) prev = c; \
inp = 0; \
for (; isdigit(c); c = gc()) { \
inp = (inp << 3) + (inp << 1) + (c - '0'); \
} \
if (prev == '-') \
inp = -inp; \
} \
void fso(type val) { \
if (!val) { \
pc('0'); \
return; \
} \
char buff[MAX_DIGIT_ ##type]; \
if (val < 0) { \
pc('-'); \
val = -val; \
} \
register int i; \
for (i = 0; val; ++i, val /= 10) { \
buff[i] = (val % 10) + '0'; \
} \
while (i--) { \
pc(buff[i]); \
} \
}
FS_INT_TYPE(int)
FS_INT_TYPE(ll)
void fsi(char *str) {
register char c = gc();
for (; c <= 32; c = gc());
register int idx = 0;
for (; c > 32; c = gc()) {
str[idx++] = c;
}
str[idx] = 0;
}
#define PRINT(str_var, length) \
register int idx = 0, len = length; \
while (idx != len) pc(str_var[idx++]);
void fso(const char *str) {
PRINT(str, strlen(str));
}
void fso(char *str) {
PRINT(str, strlen(str));
}
void fso(string &str) {
PRINT(str, str.length());
}
#undef gc
#undef putchar
template <typename farg, typename ... args>
void fsi(farg &inp, args& ... rest) {
fsi(inp);
fsi(rest...);
}
template <typename farg, typename ... args>
void fso(farg val, args ... rest) {
fso(val);
fso(rest...);
}
// WARNING: Output doesn't work for minimum value
#define MAXN (int) (1e5)
struct Str {
int a, b, c;
} strs[MAXN + 1];
#define MAXM (int) (1e5)
vi stridxs_c[MAXM + 2];
ll sqr(ll val) {
return val * val;
}
int main() {
#ifdef DEBUG
freopen("WILD.in", "r", stdin);
#endif
int n, m;
for (fsi(n, m); (n != 0) and (m != 0); fsi(n, m)) {
rep(idx, n) {
Str &str = strs[idx];
// scanf("%d %d %d", &str.a, &str.b, &str.c);
fsi(str.a, str.b, str.c);
stridxs_c[str.c].pub(idx);
}
ll ans = 0;
map<int, int> span;
span[0] = m + 1;
span[m + 1] = 0;
ll sum = 0;
dep1(c_val, m) {
vi &stridxs = stridxs_c[c_val];
while (stridxs.size()) {
Str &str = strs[stridxs.back()];
stridxs.pob();
map<int, int>::iterator spanner = span.lower_bound(str.a);
int span_val = spanner->b;
if (span_val >= str.b) {
continue;
}
// allowed to insert
map<int, int>::iterator prev_spanner = --spanner;
sum += ll(str.b - span_val) * (str.a - prev_spanner->a);
span[str.a] = str.b;
// check if prev_spanner is consumed by this spanner
while (true) {
prev_spanner = --span.lower_bound(str.a);
int prev_span_idx = prev_spanner->a, prev_span_val = prev_spanner->b;
if (prev_span_val > str.b)
break;
map<int, int>::iterator prev_prev_spanner = --prev_spanner;
sum += ll(str.b - prev_span_val) * (prev_span_idx - prev_prev_spanner->a);
span.erase(prev_span_idx);
}
}
ans += sqr(m) - sum;
}
// printf("%lld\n", ans);
fso(ans, "\n");
}
#ifdef DEBUG
rep_rt();
#endif
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8ZGVxdWU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjbGltaXRzPgojaWZkZWYgREVCVUcKICAgICNpbmNsdWRlIDxjdGltZT4KI2VuZGlmCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyB0ZW1wbGF0ZQoKLy8gYWJicmV2aWF0aW9ucwojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdmwgdmVjdG9yPGxsPgojZGVmaW5lIHZiIHZlY3Rvcjxib29sPgojZGVmaW5lIHZzIHZlY3RvcjxzdHJpbmc+CiNkZWZpbmUgaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBhIGZpcnN0CiNkZWZpbmUgYiBzZWNvbmQKI2RlZmluZSB2aWkgdmVjdG9yPGlpPgojZGVmaW5lIG1paSBtYXA8aWk+CiNkZWZpbmUgdnZpIHZlY3Rvcjx2aT4KI2RlZmluZSB2dmwgdmVjdG9yPHZsPgojZGVmaW5lIHF1ZSBxdWV1ZQojZGVmaW5lIHBxdWUgcHJpb3JpdHlfcXVldWUKI2RlZmluZSBzdGsgc3RhY2sKI2RlZmluZSBwdWIgcHVzaF9iYWNrCiNkZWZpbmUgcG9iIHBvcF9iYWNrCiNkZWZpbmUgcHVmIHB1c2hfZnJvbnQKI2RlZmluZSBwb2YgcG9wX2Zyb250CiNkZWZpbmUgcHUgcHVzaAojZGVmaW5lIHBvIHBvcAojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHN6KHZhcikgKChpbnQpIHZhci5zaXplKCkpCiNkZWZpbmUgcmVwKGl0LCBuKSBmb3IoaW50IGl0ID0gMDsgaXQgPCBuOyArK2l0KQojZGVmaW5lIGRlcChpdCwgbikgZm9yKGludCBpdCA9IG4gLSAxOyBpdCA+PSAwOyAtLWl0KQojZGVmaW5lIHJlcDEoaXQsIG4pIGZvcihpbnQgaXQgPSAxOyBpdCA8PSBuOyArK2l0KQojZGVmaW5lIGRlcDEoaXQsIG4pIGZvcihpbnQgaXQgPSBuOyBpdCA+IDA7IC0taXQpCiNkZWZpbmUgbG9vcChpdCwgZnJvbSwgdG8pIGZvcihpbnQgaXQgPSAoZnJvbSk7IGl0IDw9ICh0byk7ICsraXQpCiNkZWZpbmUgaXRlcihpdCwgY29udCkgZm9yKF9fdHlwZW9mKChjb250KS5iZWdpbigpKSBpdCA9IChjb250KS5iZWdpbigpOyBpdCAhPSAoY29udCkuZW5kKCk7ICsraXQpCiNkZWZpbmUgcml0ZXIoaXQsIGNvbnQpIGZvcihfX3R5cGVvZigoY29udCkucmJlZ2luKCkpIGl0ID0gKGNvbnQpLnJiZWdpbigpOyBpdCAhPSAoY29udCkucmVuZCgpOyArK2l0KQojZGVmaW5lIGFsbChjb250KSAoY29udCkuYmVnaW4oKSwgKGNvbnQpLmVuZCgpCiNkZWZpbmUgcm5nKGNvbnQsIG4pIGNvbnQsIGNvbnQgKyBuCiNkZWZpbmUgbWVtY2xyKHZhcikgbWVtc2V0KHZhciwgMCwgc2l6ZW9mKHZhcikpCgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKY29uc3QgaW50IElORiA9IElOVF9NQVg7CmNvbnN0IGludCBOSU5GID0gSU5UX01JTjsKY29uc3QgbGwgSU5GX0xMID0gTExPTkdfTUFYOwpjb25zdCBsbCBOSU5GX0xMID0gTExPTkdfTUlOOwpjb25zdCBkb3VibGUgUEkgPSBhY29zKC0xLjApOwpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKCiNpZmRlZiBERUJVRwogICAgI2RlZmluZSBkZWJ1ZyhmbXQsIGFyZ3MuLi4pIHByaW50ZigiTGluZSAlZCwgaW4gJXNcdDogIiBmbXQsIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sICMjYXJncykKICAgICNkZWZpbmUgcmVwX3J0KCkgcHJpbnRmKCJbUnVuIHRpbWU6ICUuM2ZzXVxuIiwgKChkb3VibGUpIGNsb2NrKCkpIC8gQ0xPQ0tTX1BFUl9TRUMpCiNlbHNlCiAgICAjZGVmaW5lIGRlYnVnKC4uLikKI2VuZGlmCgovLyBlbmQgb2YgdGVtcGxhdGUKCiNpZmRlZiBfX1dJTjMyIAogICAgI2RlZmluZSBnYyBnZXRjaGFyCiAgICAjZGVmaW5lIHBjIHB1dGNoYXIKI2Vsc2UKICAgICNkZWZpbmUgZ2MgZ2V0Y2hhcl91bmxvY2tlZAogICAgI2RlZmluZSBwYyBwdXRjaGFyX3VubG9ja2VkCiNlbmRpZgojZGVmaW5lIE1BWF9ESUdJVF9pbnQgMTAKI2RlZmluZSBNQVhfRElHSVRfbGwgMTkKI2RlZmluZSBGU19JTlRfVFlQRSh0eXBlKSBcCiAgICB2b2lkIGZzaSh0eXBlICZpbnApIHsgXAogICAgICAgIHJlZ2lzdGVyIGNoYXIgYyA9IGdjKCksIHByZXYgPSAnKyc7IFwKICAgICAgICBmb3IgKDsgIWlzZGlnaXQoYyk7IGMgPSBnYygpKSBwcmV2ID0gYzsgXAogICAgICAgIGlucCA9IDA7IFwKICAgICAgICBmb3IgKDsgaXNkaWdpdChjKTsgYyA9IGdjKCkpIHsgXAogICAgICAgICAgICBpbnAgPSAoaW5wIDw8IDMpICsgKGlucCA8PCAxKSArIChjIC0gJzAnKTsgXAogICAgICAgIH0gXAogICAgICAgIGlmIChwcmV2ID09ICctJykgXAogICAgICAgICAgICBpbnAgPSAtaW5wOyBcCiAgICB9IFwKICAgIHZvaWQgZnNvKHR5cGUgdmFsKSB7IFwKICAgICAgICBpZiAoIXZhbCkgeyBcCiAgICAgICAgICAgIHBjKCcwJyk7IFwKICAgICAgICAgICAgcmV0dXJuOyBcCiAgICAgICAgfSBcCiAgICAgICAgY2hhciBidWZmW01BWF9ESUdJVF8gIyN0eXBlXTsgXAogICAgICAgIGlmICh2YWwgPCAwKSB7IFwKICAgICAgICAgICAgcGMoJy0nKTsgXAogICAgICAgICAgICB2YWwgPSAtdmFsOyBcCiAgICAgICAgfSBcCiAgICAgICAgcmVnaXN0ZXIgaW50IGk7IFwKICAgICAgICBmb3IgKGkgPSAwOyB2YWw7ICsraSwgdmFsIC89IDEwKSB7IFwKICAgICAgICAgICAgYnVmZltpXSA9ICh2YWwgJSAxMCkgKyAnMCc7IFwKICAgICAgICB9IFwKICAgICAgICB3aGlsZSAoaS0tKSB7IFwKICAgICAgICAgICAgcGMoYnVmZltpXSk7IFwKICAgICAgICB9IFwKICAgIH0KRlNfSU5UX1RZUEUoaW50KQpGU19JTlRfVFlQRShsbCkKCnZvaWQgZnNpKGNoYXIgKnN0cikgewogICAgcmVnaXN0ZXIgY2hhciBjID0gZ2MoKTsKICAgIGZvciAoOyBjIDw9IDMyOyBjID0gZ2MoKSk7CiAgICByZWdpc3RlciBpbnQgaWR4ID0gMDsKICAgIGZvciAoOyBjID4gMzI7IGMgPSBnYygpKSB7CiAgICAgICAgc3RyW2lkeCsrXSA9IGM7CiAgICB9CiAgICBzdHJbaWR4XSA9IDA7Cn0KCiNkZWZpbmUgUFJJTlQoc3RyX3ZhciwgbGVuZ3RoKSBcCiAgICByZWdpc3RlciBpbnQgaWR4ID0gMCwgbGVuID0gbGVuZ3RoOyBcCiAgICB3aGlsZSAoaWR4ICE9IGxlbikgcGMoc3RyX3ZhcltpZHgrK10pOwoKdm9pZCBmc28oY29uc3QgY2hhciAqc3RyKSB7CiAgICBQUklOVChzdHIsIHN0cmxlbihzdHIpKTsKfQoKdm9pZCBmc28oY2hhciAqc3RyKSB7CiAgICBQUklOVChzdHIsIHN0cmxlbihzdHIpKTsKfQoKdm9pZCBmc28oc3RyaW5nICZzdHIpIHsKICAgIFBSSU5UKHN0ciwgc3RyLmxlbmd0aCgpKTsKfQojdW5kZWYgZ2MKI3VuZGVmIHB1dGNoYXIKCnRlbXBsYXRlIDx0eXBlbmFtZSBmYXJnLCB0eXBlbmFtZSAuLi4gYXJncz4Kdm9pZCBmc2koZmFyZyAmaW5wLCBhcmdzJiAuLi4gcmVzdCkgewogICAgZnNpKGlucCk7CiAgICBmc2kocmVzdC4uLik7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBmYXJnLCB0eXBlbmFtZSAuLi4gYXJncz4Kdm9pZCBmc28oZmFyZyB2YWwsIGFyZ3MgLi4uIHJlc3QpIHsKICAgIGZzbyh2YWwpOwogICAgZnNvKHJlc3QuLi4pOwp9Ci8vIFdBUk5JTkc6IE91dHB1dCBkb2Vzbid0IHdvcmsgZm9yIG1pbmltdW0gdmFsdWUKCiNkZWZpbmUgTUFYTiAoaW50KSAoMWU1KQpzdHJ1Y3QgU3RyIHsKICAgIGludCBhLCBiLCBjOwp9IHN0cnNbTUFYTiArIDFdOwoKI2RlZmluZSBNQVhNIChpbnQpICgxZTUpCnZpIHN0cmlkeHNfY1tNQVhNICsgMl07CgpsbCBzcXIobGwgdmFsKSB7CiAgICByZXR1cm4gdmFsICogdmFsOwp9CgppbnQgbWFpbigpIHsKI2lmZGVmIERFQlVHCiAgICBmcmVvcGVuKCJXSUxELmluIiwgInIiLCBzdGRpbik7CiNlbmRpZgoKICAgIGludCBuLCBtOwogICAgZm9yIChmc2kobiwgbSk7IChuICE9IDApIGFuZCAobSAhPSAwKTsgZnNpKG4sIG0pKSB7CiAgICAgICAgcmVwKGlkeCwgbikgewogICAgICAgICAgICBTdHIgJnN0ciA9IHN0cnNbaWR4XTsKICAgICAgICAgICAgLy8gc2NhbmYoIiVkICVkICVkIiwgJnN0ci5hLCAmc3RyLmIsICZzdHIuYyk7CiAgICAgICAgICAgIGZzaShzdHIuYSwgc3RyLmIsIHN0ci5jKTsKICAgICAgICAgICAgc3RyaWR4c19jW3N0ci5jXS5wdWIoaWR4KTsKICAgICAgICB9CiAgICAgICAgbGwgYW5zID0gMDsKCiAgICAgICAgbWFwPGludCwgaW50PiBzcGFuOwogICAgICAgIHNwYW5bMF0gPSBtICsgMTsKICAgICAgICBzcGFuW20gKyAxXSA9IDA7CgogICAgICAgIGxsIHN1bSA9IDA7CiAgICAgICAgZGVwMShjX3ZhbCwgbSkgewogICAgICAgICAgICB2aSAmc3RyaWR4cyA9IHN0cmlkeHNfY1tjX3ZhbF07CiAgICAgICAgICAgIHdoaWxlIChzdHJpZHhzLnNpemUoKSkgewogICAgICAgICAgICAgICAgU3RyICZzdHIgPSBzdHJzW3N0cmlkeHMuYmFjaygpXTsKICAgICAgICAgICAgICAgIHN0cmlkeHMucG9iKCk7CiAgICAgICAgICAgICAgICBtYXA8aW50LCBpbnQ+OjppdGVyYXRvciBzcGFubmVyID0gc3Bhbi5sb3dlcl9ib3VuZChzdHIuYSk7CiAgICAgICAgICAgICAgICBpbnQgc3Bhbl92YWwgPSBzcGFubmVyLT5iOwogICAgICAgICAgICAgICAgaWYgKHNwYW5fdmFsID49IHN0ci5iKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBhbGxvd2VkIHRvIGluc2VydAogICAgICAgICAgICAgICAgbWFwPGludCwgaW50Pjo6aXRlcmF0b3IgcHJldl9zcGFubmVyID0gLS1zcGFubmVyOwogICAgICAgICAgICAgICAgc3VtICs9IGxsKHN0ci5iIC0gc3Bhbl92YWwpICogKHN0ci5hIC0gcHJldl9zcGFubmVyLT5hKTsKICAgICAgICAgICAgICAgIHNwYW5bc3RyLmFdID0gc3RyLmI7CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHJldl9zcGFubmVyIGlzIGNvbnN1bWVkIGJ5IHRoaXMgc3Bhbm5lcgogICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICBwcmV2X3NwYW5uZXIgPSAtLXNwYW4ubG93ZXJfYm91bmQoc3RyLmEpOwogICAgICAgICAgICAgICAgICAgIGludCBwcmV2X3NwYW5faWR4ID0gcHJldl9zcGFubmVyLT5hLCBwcmV2X3NwYW5fdmFsID0gcHJldl9zcGFubmVyLT5iOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmV2X3NwYW5fdmFsID4gc3RyLmIpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIG1hcDxpbnQsIGludD46Oml0ZXJhdG9yIHByZXZfcHJldl9zcGFubmVyID0gLS1wcmV2X3NwYW5uZXI7CiAgICAgICAgICAgICAgICAgICAgc3VtICs9IGxsKHN0ci5iIC0gcHJldl9zcGFuX3ZhbCkgKiAocHJldl9zcGFuX2lkeCAtIHByZXZfcHJldl9zcGFubmVyLT5hKTsKICAgICAgICAgICAgICAgICAgICBzcGFuLmVyYXNlKHByZXZfc3Bhbl9pZHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFucyArPSBzcXIobSkgLSBzdW07CiAgICAgICAgfQogICAgICAgIC8vIHByaW50ZigiJWxsZFxuIiwgYW5zKTsKICAgICAgICBmc28oYW5zLCAiXG4iKTsKICAgIH0KCiNpZmRlZiBERUJVRwogICAgcmVwX3J0KCk7CiNlbmRpZgogICAgcmV0dXJuIDA7Cn0=