RT
#include<bits/stdc++.h>
using namespace std;
struct p {
int a, b, c, cnt, ans = 0;
bool operator != (const p &B) const {
return a != B.a || b != B.b || c != B.c;
}
} s1[200005], s2[200005];
bool cmpa(p a, p b) {
if (a.a != b.a)
return a.a < b.a;
if (a.b != b.b)
return a.b < b.b;
return a.c < b.c;
}
bool cmpb(p a, p b) {
if (a.b != b.b)
return a.b < b.b;
return a.c < b.c;
}
int k, c[200005];
int lb(int x) {
return x & (-x);
}
void add(int x, int v) {
for (; x <= k; x += lb(x))
c[x] += v;
}
int query(int x) {
int ans = 0;
for (; x; x -= lb(x))
ans += c[x];
return ans;
}
void cdq(int l, int r) {
if (l >= r)
return ;
int mid = (l + r) >> 1;
cdq(l, mid);
cdq(mid + 1, r);
sort(s2 + l, s2 + mid + 1, cmpb);
sort(s2 + mid + 1, s2 + r + 1, cmpb);
int j = l;
for (int i = mid + 1; i <= r; i++) {
while (j <= mid && s2[j].b <= s2[i].b) {
add(s2[j].c, s2[j].cnt);
++j;
}
s2[i].ans += query(s2[i].c);
}
for (int i = l; i < j; i++)
add(s2[i].c, -s2[i].cnt);
// sort(s2 + mid + 1, s2 + r + 1, cmpa);
}
int cnt[200005];
int main() {
int n, n1 = 0;
scanf("%d%d", &n1, &k);
for (int i = 1; i <= n1; i++) {
scanf("%d%d%d", &s1[i].a, &s1[i].b, &s1[i].c);
s1[i].ans = s1[i].cnt = 0;
}
sort(s1 + 1, s1 + n1 + 1, cmpa);
for (int i = 1; i <= n1; i++) {
if (i == 1 || s1[i] != s2[n]) {
s2[++n] = s1[i];
s2[n].cnt = 1;
} else {
++s2[n].cnt;
}
}
cdq(1, n);
for (int i = 1; i <= n; i++) {
cnt[s2[i].ans + s2[i].cnt - 1] += s2[i].cnt;
// cout << "!!! " << i << ' ' << s2[i].ans << ' ' << s2[i].cnt << '\n';
}
for (int i = 0; i < n1; i++)
printf("%d\n", cnt[i]);
return 0;
}