其实按理说会 TLE 几个点,但最小的都 WA。
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x&(-x))
using namespace std;
int n,k;
int tree[200005];
int f[100006];
int ans[100005];
struct P{
int a,b,c,i;
}p[100005],q[100005];
inline bool cmp(P x,P y){
if(x.a==y.a){
if(x.b==y.b) return x.c<y.c;
return x.b<y.b;
}
return x.a<y.a;
}
void add(int x){
for(;x<=k;x+=lowbit(x))++tree[x];
return ;
}
int check(int x){
int sum=0;
for(;x>0;x-=lowbit(x))sum+=tree[x];
return sum;
}
inline bool cmp3(P x,P y){
if(x.b <y.b )return 1;
if(x.b >y.b )return 0;
return x.a >y.a ;
}
void merge(int l,int r){
if(l==r)return ;
if(r<l)return ;
int mid=(l+r)/2;
merge(l,mid);
merge(mid+1,r);
for(int i=0;i<=k;++i){
tree[i]=0;
}
for(int i=l;i<=r;++i){
q[i].b =p[i].b ;
q[i].c =p[i].c ;
q[i].a =(i<=mid?1:0);
q[i].i =p[i].i ;
}
sort(q+l,q+r+1,cmp3);
for(int i=l;i<=r;++i){
if(q[i].a )add(q[i].c );
else f[q[i].i ]+=check(q[i].c );
}
return ;
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>k;
for(int i=1;i<=n;++i){
cin>>p[i].a>>p[i].b >>p[i].c ;
p[i].i =i;
}
sort(p+1,p+n+1,cmp);
merge(1,n);
for(int i=1;i<=n;++i){
++ans[f[i]];
}
for(int i=0;i<n;++i){
cout<<ans[i]<<endl;
}
return 0;
}