rt
# include <bits/stdc++.h>
# define int long long
using namespace std;
inline int read(){int s = 0 , w = 0;char c = getchar();while(!isdigit(c)){w |= (c == '-');c = getchar();}while(isdigit(c)){s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return w ? -s : s;}
inline void write(int x){if(x < 0) putchar('-') , x = -x;if(x > 9) write(x / 10);putchar(x % 10 | 48);}
inline void writesp(int x){write(x) , putchar(' ');}
inline void writeln(int x){write(x) , putchar('\n');}
const int N = 2e5 + 10;
int n ,mx ,m ,ans[N];
struct node {
int x ,y ,z ,val;
int num;
bool operator < (const node &b) const {
if (x != b.x) return x < b.x;
if (y != b.y) return y < b.y;
return z < b.z;
}
} a[N] ,b[N] ,p[N];
struct BIT {
int c[N];
void init (){memset (c ,0 ,sizeof c);}
inline int lowbit (int x){return x & (-x);}
inline void modify (int x ,int val){for (int i = x ;i <= mx ;i += lowbit (i)) c[i] += val;}
inline int query (int x){int res = 0 ;for (int i = x ;i ; i -= lowbit (i)) res += c[i]; return res;}
}B;
struct Cdq {
void cdq (int l ,int r){
if (l == r) return ;
int mid = ((l + r) >> 1ll);
cdq (l ,mid) ,cdq (mid + 1, r);
int pl = l ,pr = mid + 1;
for (int i = l ; i <= r; i ++){
if ((p[pl].y <= p[pr].y && pl <= mid) || (pr > r)){
B.modify (p[pl].z, p[pl].val);
b[i] = p[pl ++];
} else {
p[pr].num += B.query (p[pr].z);
b[i] = p[pr ++];
}
}
for (int i = l ; i < pl ; i ++) B.modify (p[i].z ,-p[i].val);
for (int i = l ; i <= r; i ++) p[i] = b[i];
}
}C;
signed main(){
n = read () ,mx = read ();
for (int i = 1; i <= n ;i ++) a[i].x = read() ,a[i].y = read() ,a[i].z = read();
int num = 0;
for (int i = 1; i <= n; i ++){
++ num;
if (a[i].x != a[i + 1].x || a[i].y != a[i + 1].y || a[i].z != a[i + 1].z){
p[++ m] = a[i];
p[m].val = num;
num = 0;
}
}
C.cdq (1 ,m);
for (int i = 1 ;i <= m ;i ++)
ans[p[i].num + p[i].val] += p[i].val;
for (int i = 1 ; i <= n; i ++) writeln (ans[i]);
return 0;
}