RT,应该是cdq分治那个地方写错了,但是查不出来/kk
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
int a,b,c;
}p[100005],q[100005];
int n,k;
int t[100005];
int s[100005],ans[100005];
bool cmp(node _1,node _2){
return _1.a<_2.a;
}
int lowbit(int x){
return x&(-x);
}
void update(int x,int v){
for (int i=x;i<=n;i+=lowbit(i)){
s[i]+=v;
}
}
int query(int x){
int sum=0;
for (int i=x;i>0;i-=lowbit(i)){
sum+=s[i];
}
return sum;
}
void CDQ(int l,int r){
if (l==r){
return;
}
int mid=(l+r)>>1;
CDQ(l,mid);
CDQ(mid+1,r);
int _1=l,_2=mid+1,cnt=0;
while(_1<=mid&&_2<=r){
if (p[_1].b<=p[_2].b){
q[++cnt]=p[_1];
update(p[_1].c,1);
_1++;
}
else{
q[++cnt]=p[_2];
ans[_2]+=query(p[_2].c);
_2++;
}
}
while(_1<=mid){
q[++cnt]=p[_1];
update(p[_1].c,1);
_1++;
}
while(_2<=r){
q[++cnt]=p[_2];
ans[_2]+=query(p[_2].c);
_2++;
}
for (int i=l;i<=mid;i++){
update(p[i].c,-1);
}
for (int i=1;i<=cnt;i++){
p[l+i-1]=q[i];
}
}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++){
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
}
sort(p+1,p+n+1,cmp);
CDQ(1,n);
for (int i=1;i<=n;i++){
++t[ans[i]];
}
for (int i=0;i<n;i++){
printf("%d\n",t[i]);
}
return 0;
}