寄
#include<bits/stdc++.h>
#define lowbit(x) x&(-x)
using namespace std;
struct node
{
int x,y,z,cnt;
}nodes[1000001],nodes_[1000001];
int cnt,n_,n,k,tree[1000001],Ans[1000001],ans[1000001];
stack<pair<int,int> >sta;
int change(int x,int b)
{
for(;b<=k;b+=lowbit(b))
tree[b]+=x;
}
int query(int b)
{
int ans=0;
for(;b;b-=lowbit(b))
ans+=tree[b];
return ans;
}
bool cmp1(node a,node b)
{
if(a.x!=b.x) return a.x<b.x;
if(a.y!=b.y) return a.y<b.y;
return a.z<b.z;
}
bool cmp2(node a,node b)
{
if(a.y!=b.y) return a.y<b.y;
return a.z<b.z;
}
void solve(int l,int r)
{
if(l>=r) return;
int m=(l+r)>>1;
solve(l,m);
solve(m+1,r);
sort(nodes+l,nodes+m+1,cmp2);
sort(nodes+m+1,nodes+r+1,cmp2);
int i=l,j=m+1;
while(i<=m&&j<=r)
{
if(nodes[i].y<=nodes[j].y)
change(nodes[i].cnt,nodes[i].z),sta.push({nodes[i].cnt,nodes[i].z}),i++;
else
Ans[j]+=query(nodes[j].z),j++;
}
while(j<=r)
Ans[j]+=query(nodes[j].z),j++;
while(!sta.empty())
{
change(-sta.top().first,sta.top().second);
sta.pop();
}
}
int main()
{
int x_=-1,y_=-1,z_=-1;
cin>>n_>>k;
for(int i=1;i<=n_;i++)
cin>>nodes_[i].x>>nodes_[i].y>>nodes_[i].z;
sort(nodes_+1,nodes_+1+n_,cmp1);
for(int i=1;i<=n_;i++)
{
if(x_!=nodes_[i].x||y_!=nodes_[i].y||z_!=nodes_[i].z)
x_=nodes_[i].x,y_=nodes_[i].y,z_=nodes_[i].z,nodes[++n]=nodes_[i];
nodes[n].cnt++;
}
solve(1,n);
for(int i=1;i<=n;i++)
ans[Ans[i]+nodes[i].cnt-1]+=nodes[i].cnt;
for(int i=0;i<n_;i++)
cout<<ans[i]<<endl;
}
/*
8 7
1 2 3
1 2 3
2 3 4
2 3 4
2 3 4
7 6 5
4 2 5
8 4 2
*/