#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
struct a1{
int a,b,c,ans,cnt,k;
}xx[N],x[N],b[N],c[N];
int n,m,shu[N];
bool aa(a1 a,a1 b){
if(a.a==b.a){
if(a.b==b.b)return a.c<b.c;
return a.b<b.b;
}
return a.a<b.a;
}
int ans[N];
void CDQ2(int l,int r){
int mid=(l+r)>>1;
if(l==r)return ;
CDQ2(l,mid);CDQ2(mid+1,r);
int cnt=0;
for(int i=l,j=l,q=mid+1;i<=r;i++){
if((q>r||b[j].c<=b[q].c)&&j<=mid){
c[i]=b[j++];
if(c[i].k!=0)cnt+=c[i].cnt;
}
else {
c[i]=b[q++];
if(!c[i].k){
c[i].ans+=cnt;
}
}
}
for(int q=l;q<=r;q++)b[q]=c[q];
}
void CDQ(int l,int r){
int mid=(l+r)>>1;
if(l==r)return ;
CDQ(l,mid);CDQ(mid+1,r);
for(int i=l,j=l,q=mid+1;i<=r;i++){
if(q>r){
b[i]=x[j++];b[i].k=1;
}
else if(x[j].b<=x[q].b&&j<=mid){
if(x[j].b==x[q].b&&x[j].c>x[q].c){
b[i]=x[q++];b[i].k=0;
}
else b[i]=x[j++];b[i].k=1;
}
else {
b[i]=x[q++];b[i].k=0;
}
}
for(int q=l;q<=r;q++)x[q]=b[q];
CDQ2(l,r);
}
int main(){
scanf("%d%d",&n,&m);
for(int q=1;q<=n;q++){
scanf("%d%d%d",&xx[q].a,&xx[q].b,&xx[q].c);
}
sort(xx+1,xx+1+n,aa);
int p=0,i=0;
for(int q=1;q<=n;q++){
p++;
if(xx[q].a!=xx[q+1].a||xx[q].b!=xx[q+1].b||xx[q].c!=xx[q+1].c){
x[++i]=xx[q];
x[i].cnt=p;x[i].ans=0;
p=0;
}
}
CDQ(1,i);
for(int q=1;q<=i;q++){
ans[x[q].ans+x[q].cnt-1]+=x[q].cnt;
}
for(int q=0;q<n;q++){
cout<<ans[q]<<"\n";
}
return 0;
}