#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=100005,K=200005; int n,k,tot,t[K],ans[N]; struct qwe { int x,y,z,con,ans; }a[N]; bool cmp1(const qwe &a,const qwe &b) { return (a.x==b.x&&a.y==b.y&&a.z<b.z)||(a.x==b.x&&a.y<b.y)||(a.x<b.x); } bool cmp2(const qwe &a,const qwe &b) { return (a.y==b.y&&a.z==b.z&&a.x<b.x)||(a.y==b.y&&a.z<b.z)||(a.y<b.y); } int read() { int r=0,f=1; char p=getchar(); while(p>‘9‘||p<‘0‘) { if(p==‘-‘) f=-1; p=getchar(); } while(p>=‘0‘&&p<=‘9‘) { r=r*10+p-48; p=getchar(); } return r*f; } int lb(int x) { return x&(-x); } void update(int x,int v) { for(int i=x;i<=k;i+=lb(i)) t[i]+=v; } int ques(int x) { int r=0; for(int i=x;i>=1;i-=lb(i)) r+=t[i]; return r; } void cdq(int l,int r) { if(l==r) { a[l].ans+=a[l].con-1; return; } int mid=(l+r)>>1; cdq(l,mid); cdq(mid+1,r); sort(a+l,a+1+mid,cmp2); sort(a+mid+1,a+1+r,cmp2); int j=l; for(int i=mid+1;i<=r;i++) { for(;j<=mid&&a[j].y<=a[i].y;j++) update(a[j].z,a[j].con); a[i].ans+=ques(a[i].z); } for(int i=l;i<j;i++) update(a[i].z,-a[i].con); } int main() { n=read(),k=read(); for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),a[i].z=read(),a[i].ans=1; sort(a+1,a+1+n,cmp1); for(int i=1;i<=n;i++) if(i!=1&&a[i].x==a[i-1].x&&a[i].y==a[i-1].y&&a[i].z==a[i-1].z) a[tot].con++; else a[++tot]=a[i],a[tot].con++; cdq(1,tot); for(int i=1;i<=tot;i++) ans[a[i].ans]+=a[i].con;//cout<<n<<endl; for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0; }