#include<bits/stdc++.h>
#define INF 1e16
#define endl '\n'
#define pb push_back
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int maxn = 4e5+5;
inline int read(){
register int x=0,f=1;register char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int N,n,k,cnt,ans[maxn];
struct Array{int x,y,z,w,ans;}a[maxn],b[maxn];
struct Tree{
int tr[maxn],N;
int lowbit(int x){return x&(-x);}
void add(int x,int k){for(;x<=N;x+=lowbit(x))tr[x]+=k;}
int query(int x){int ans=0;for(;x;x-=lowbit(x))ans+=tr[x];return ans;}
}T;
bool cmp1(Array x,Array y){
if(x.x==y.x){
if(x.y==y.y)return x.z<y.z;
return x.y<y.y;
}
return x.x<y.x;
}
bool cmp2(Array x,Array y){
if(x.y==y.y)return x.z<y.z;
return x.y<y.y;
}
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,cmp2),sort(a+mid+1,a+r+1,cmp2);
int i=l,j=mid+1;
while(j<=r){
while(a[i].y<=a[j].y&&i<=mid)T.add(a[i].z,a[i].w),i++;
a[j].ans+=T.query(a[j].z),j++;
}
for(int k=l;k<i;k++)T.add(a[k].z,-a[k].w);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>N>>k,T.N=N;
for(int i=1;i<=N;i++)cin>>b[i].x>>b[i].y>>b[i].z;
sort(b+1,b+N+1,cmp1);
for(int i=1;i<=N;i++){
cnt++;
if(b[i].x==b[i+1].x&&b[i].y==b[i+1].y&&b[i].z==b[i+1].z)continue;
n++,a[n]=b[i],a[n].w=cnt,cnt=0;
}
CDQ(1,n);
for(int i=1;i<=n;i++)ans[a[i].ans+a[i].w-1]+=a[i].w;
for(int i=0;i<N;i++)cout<<ans[i]<<endl;
return 0;
}