#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
return s*w;
}
inline void print(int x)
{
if(x<0)x=-x,putchar('-');
if(x>=10)print(x/10);
putchar(x%10+48);
}
int n,k,m,C[1000010],f[1000010];
inline int lowbit(int x)
{
return x&(-x);
}
struct node{
int a,b,c,cnt,ans;
}a[1000010],w[1000010];
bool cmp(node a,node 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;
}
bool cmp1(node a,node b)
{
if(a.b==b.b)return a.c<b.c;
return a.b<b.b;
}
inline void update(int x,int v){
while(x<=k)
{
// cout<<x<<"\n";
C[x]+=v;
x+=lowbit(x);
}
}
inline int query(int x)
{
int res=0;
while(x)
{
res+=C[x];
x-=lowbit(x);
}
return res;
}
inline void CDQ(int l,int r){
if(l==r)return;
int mid=l+r>>1;
CDQ(l,mid);
CDQ(mid+1,r);
sort(w+l,w+mid+1,cmp1);
sort(w+mid+1,w+r+1,cmp1);
int j=l;//[l,j)已经跑过。
for(int i=mid+1;i<=r;i++)
{
// cout<<i<<' ';
while(w[i].b>=w[j].b&&j<=mid)
{
//cout<<j<<' '<<w[j].c<<" "<<w[j].cnt<<'\n';
update(w[j].c,w[j].cnt);
j++;
}
w[i].ans+=query(w[i].c);
}
for(int i=l;i<j;i++)update(w[i].c,-w[i].cnt);
}
signed main()
{
n=read();
k=read();
for(int i=1;i<=n;i++)
{
a[i]={read(),read(),read()};
}
sort(a+1,a+n+1,cmp);
m=0;
int cou=0;
for(int i=1;i<=n;i++)
{
cou++;
if(a[i].a!=a[i-1].a||a[i].b!=a[i-1].b||a[i].c!=a[i-1].c)
{
m++;
w[i]=a[i];
w[i].cnt=cou;
cou=0;
}
}
n=m;
CDQ(1,n);
for(int i=1;i<=n;i++)
{
f[w[i].ans+w[i].cnt-1]+=w[i].cnt;
}
for(int i=0;i<n;i++)
{
print(f[i]);
puts("");
}
}
似乎是update里面死循环了,但不知道死循环原因/kk