#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 5, N2 = 2e5 + 5;
int n, k;
LL ans[N], x[N2];
map<LL, int> mp;
struct edge {
int a, b, c;
LL ans;
}p[N], q[N];
bool cmp(const edge &x, const edge &y) {
return x.a < y.a;
}
int lowbit(int x) {
return x & (-x);
}
void modify(int i, int v) {
for (; i <= k; i += lowbit(i)) x[i] += v;
return;
}
LL query(int i) {
LL ret = 0;
for (; i; i -= lowbit(i)) ret += x[i];
return ret;
}
void merge_sort(int l, int r) {
if (l == r) return;
int mid = (l + r) >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int p1 = l, p2 = mid + 1, tot = 0;
while (p1 <= mid || p2 <= r) {
if (p1 <= mid && (p2 > r || p[p1].b <= p[p2].b)) {
q[++tot] = p[p1];
modify(p[p1].c, 1);
p1++;
} else {
p[p2].ans += query(p[p2].c);
q[++tot] = p[p2];
p2++;
}
}
for (int i = l; i <= mid; ++i) modify(p[i].c, -1);
for (int i = 1; i <= tot; ++i) p[l + i - 1] = q[i];
return;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].c);
p[i].ans = 0;
}
sort(p + 1, p + n + 1, cmp);
merge_sort(1, n);
for (int i = 1; i <= n; ++i) ++mp[p[i].ans];
for (int i = 0; i < n; ++i) printf("%d\n", mp[i]);
return 0;
}