#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=2e5+5;
struct Segment_Tree
{
int ls,rs,sum;
}tree[M*100];
struct node
{
int x,y,z;
bool operator<(node i)const
{
return x!=i.x?x<i.x:y!=i.y?y<i.y:z<i.z;
}
bool operator==(node i)const
{
return x==i.x&&y==i.y&&z==i.z;
}
}a[N];
int ans[N],cnt,root[M*4],n,k;
void push_up(int id)
{
tree[id].sum=tree[tree[id].ls].sum+tree[tree[id].rs].sum;
}
void sed_update(int id,int l,int r,int p,int sum)
{
if(l==r)
{
tree[id].sum+=sum;
return;
}
int mid=l+r>>1;
if(p<=mid)
{
if(tree[id].ls==0)tree[id].ls=++cnt;
sed_update(tree[id].ls,l,mid,p,sum);
}
else
{
if(tree[id].rs==0)tree[id].rs=++cnt;
sed_update(tree[id].rs,mid+1,r,p,sum);
}
push_up(id);
}
void fst_update(int id,int l,int r,int p,int v,int sum)
{
if(r<p||l>p)return;
if(root[id]==0)root[id]=++cnt;
sed_update(root[id],1,k,v,sum);
if(l==r)return;
int mid=l+r>>1;
fst_update(id*2,l,mid,p,v,sum);
fst_update(id*2+1,mid+1,r,p,v,sum);
}
int sed_query(int id,int l,int r,int ql,int qr)
{
if(l>ql||r<ql||id==0)return 0;
if(l>=ql&&r<=qr)return tree[id].sum;
int mid=l+r>>1;
return sed_query(tree[id].ls,l,mid,ql,qr)+sed_query(tree[id].rs,mid+1,r,ql,qr);
}
int fst_query(int id,int l,int r,int fl,int fr,int sl,int sr)
{
if(l>fr||r<fl)return 0;
if(l>=fl&&r<=fr)return sed_query(root[id],1,k,sl,sr);
int mid=l+r>>1;
return fst_query(id*2,l,mid,fl,fr,sl,sr)+fst_query(id*2+1,mid+1,r,fl,fr,sl,sr);
}
signed main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].z;
}
sort(a+1,a+1+n);
for(int i=1,j=1;i<=n;i++)
{
if(a[i]==a[i+1])
{
j++;
continue;
}
fst_update(1,1,k,a[i].y,a[i].z,j);
ans[fst_query(1,1,k,1,a[i].y,1,a[i].z)-1]+=j;
j=1;
}
for(int i=0;i<n;i++)
{
cout<<ans[i]<<"\n";
}
return 0;
}