package main import ( "fmt" "sort" ) const N int = 1e5 + 5 const K int = 2e5 + 5 type node struct { a, b, c, cnt, res int } var ( q []node w [N]node c, ans [K]int ) func lowbit(x int) int { return x & -x } func add(x, y int) { for ; x <= 2e5; x += lowbit(x) { c[x] += y } } func sum(x int) int { var res int = 0 for ; x > 0; x -= lowbit(x) { res += c[x] } return res } func mergeSort(l, r int) { if l >= r { return } var mid = (l + r) / 2 mergeSort(l, mid) mergeSort(mid+1, r) var i, j, k = l, mid + 1, 0 for i <= mid && j <= r { if q[i].b <= q[j].b { add(q[i].c, q[i].cnt) k++ w[k] = q[i] i++ } else { q[j].res += sum(q[j].c) k++ w[k] = q[j] j++ } } for i <= mid { add(q[i].c, q[i].cnt) k++ w[k] = q[i] i++ } for j <= r { q[j].res += sum(q[j].c) k++ w[k] = q[j] j++ } for i = l; i <= mid; i++ { add(q[i].c, -q[i].cnt) } for i, j := l, 1; j <= k; j++ { q[i] = w[j] i++ } } func main() { var n, k int fmt.Scan(&n, &k) q = append(q, node{}) for i := 1; i <= n; i++ { var a, b, c int fmt.Scan(&a, &b, &c) q = append(q, node{a, b, c, 1, 0}) } sort.Slice(q, func(x, y int) bool { if q[x].a != q[y].a { return q[x].a < q[y].a } if q[x].b != q[y].b { return q[x].b < q[y].b } return q[x].c < q[y].c }) k = 1 for i := 2; i <= n; i++ { if q[i].a == q[k].a && q[i].b == q[k].b && q[i].c == q[k].c { q[k].cnt++ } else { k++ q[k] = q[i] } } mergeSort(1, k) for i := 1; i <= k; i++ { ans[q[i].res+q[i].cnt-1] += q[i].cnt } for i := 0; i < n; i++ { fmt.Println(ans[i]) } }