#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int n,k;
struct node{
int x,y,z;
}a[N];
struct node2{
int p,x,id;
}b[N];
int c[N],f[N],d[N];
bool cmp(node a,node b){
return (a.x==b.x)?((a.y==b.y)?(a.z<=b.z):(a.y<b.y)):(a.x<b.x);
}
bool cmp2(node2 a,node2 b){
return (a.p==b.p)?(a.id<=b.id):(a.p<b.p);
}
int lowbit(int x){
return x&(-x);
}
void add(int x,int d){
for(int i=x;i<=k;i+=lowbit(i))c[i]+=d;
}
int query(int x){
int ret=0;for(int i=x;i;i-=lowbit(i))ret+=c[i];return ret;
}
void CDQ(int l,int r){
if(l>=r)return ;
int mid=l+r>>1,cnt=0;
for(int i=l;i<=r;i++){
b[++cnt].p=a[i].y;b[cnt].id=i;b[cnt].x=a[i].z;
}
sort(b+1,b+cnt+1,cmp2);
for(int i=1;i<=cnt;i++){
if(b[i].id<=mid)add(b[i].x,1);
else{
int t=query(b[i].x);
f[b[i].id]+=t;
}
}
for(int i=1;i<=cnt;i++){
if(b[i].id<=mid)add(b[i].x,-1);
}
int num=0;
for(int i=mid+1;i<=r;i++){if(a[i].x==a[mid].x&&a[i].y==a[mid].y&&a[i].z==a[mid].z)num++;else break;}
for(int i=mid;i>=l;i--){
if(a[i].x==a[mid].x&&a[i].y==a[mid].y&&a[i].z==a[mid].z)f[i]+=num;else break;
}
CDQ(l,mid);CDQ(mid+1,r);
}
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+n+1,cmp);
CDQ(1,n);
for(int i=1;i<=n;i++)d[f[i]]++;
for(int i=0;i<n;i++)cout<<d[i]<<"\n";
return 0;
}