#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N = 2e6 + 5;
int n, k, ans[N];
struct node {
int a, b, c;
int cnt, ans;
}b[N],a[N];
int cntx;
int t[N];
inline void add(int k, int v) { while (k <= n) t[k] += v, k += k & -k; }
inline int sum(int k) { int ans = 0; while (k != 0) { ans += t[k], k -= k & -k; } 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(a + l, a + mid + 1, [](node x, node y) {
if (x.b == y.b) { return x.c < y.c; }
return x.b < y.b;
});
sort(a + mid + 1, a + r, [](node x, node y) {
if (x.b == y.b) { return x.c < y.c; }
return x.b < y.b;
});
int j, i = l;
for (j = mid + 1; j <= r; ++j) {
while (a[j].b > a[i].b && i <= mid) {
add(a[j].c, a[j].cnt);
++i;
}
if (i > mid) { break; }
a[j].ans += sum(a[j].c);
}
for (int i = l; i <= r; ++i) { add(a[i].c, -a[i].cnt); }
}
signed main() {
cin >> n >> k;
for (int i = 1; i <= n; ++i) { cin >> b[i].a >> b[i].b >> b[i].c; }
sort(b + 1, b + n + 1, [](node x, node y) {
if (x.a == y.a) {
if (x.b == y.b) { return x.c < y.c; }
return x.b < y.b;
}
return x.a < y.a;
});
int l = 0;
for (int i = 1; i <= n; ++i) {
++l;
if (b[i].a != b[i + 1].a ||
b[i].b != b[i + 1].b ||
b[i].c != b[i + 1].c) {
a[++cntx].a = b[i].a;
a[cntx].b = b[i].b;
a[cntx].c = b[i].c;
a[cntx].cnt = l;
l = 0;
}
}
CDQ(1, cntx);
for (int i = 1; i <= cntx; ++i) { ans[a[i].ans + a[i].cnt - 1] += a[i].cnt; }
for (int i = 0; i < n; ++i) { cout << ans[i] << '\n'; }
return 0;
}