最后一个点一直MLE,不知道怎么优化空间了……
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 200010
#define A 200000
int n,k,ans[N];
class listree{
public:
#define lb(x) (x&-x)
class segtree{
public:
int root[N],tot;
class node{
public:
int l,r,lp,rp,sum,lz;
}a[400*N];
int newnode(int val,int li,int ri){
a[++tot].sum=val*(ri-li+1),a[tot].lp=li,a[tot].rp=ri;
return tot;
}void newst(int n){
for(int i=1;i<=n;i++)root[i]=newnode(0,1,n);
return;
}void up(int x){
if(x)a[x].sum=a[a[x].l].sum+a[a[x].r].sum;
return;
}void pd(int x){
int mid=(a[x].lp+a[x].rp)>>1;
if(!a[x].l)a[x].l=newnode(0,a[x].lp,mid);
if(!a[x].r)a[x].r=newnode(0,mid+1,a[x].rp);
a[a[x].l].sum+=a[x].lz*(a[a[x].l].rp-a[a[x].l].lp+1);
a[a[x].r].sum+=a[x].lz*(a[a[x].r].rp-a[a[x].r].lp+1);
a[a[x].r].lz+=a[x].lz,a[a[x].l].lz+=a[x].lz,a[x].lz=0;
return;
}void ad(int x,int li,int ri,int val){
if(a[x].rp<li||a[x].lp>ri)return;
else if(li<=a[x].lp&&a[x].rp<=ri){
a[x].sum+=val*(a[x].rp-a[x].lp+1),a[x].lz+=val;
return;
}pd(x),ad(a[x].l,li,ri,val),ad(a[x].r,li,ri,val),up(x);
return;
}void add(int k,int li,int ri,int val){
ad(root[k],li,ri,val);
return;
}int su(int x,int li,int ri){
if(a[x].rp<li||a[x].lp>ri)return 0;
else if(li<=a[x].lp&&a[x].rp<=ri)return a[x].sum;
pd(x);
return su(a[x].l,li,ri)+su(a[x].r,li,ri);
}int sum(int k,int li,int ri){
return su(root[k],li,ri);
}
}st;
void add(int x,int p,int val){
while(x<=k){
st.add(x,p,p,val);
x+=lb(x);
}return;
}int sum(int x,int li,int ri){
int ans=0;
while(x){
ans+=st.sum(x,li,ri);
x-=lb(x);
}return ans;
}
}lt;
class data{
public:
int a,b,c,i;
bool operator <(data x)const{
return a<x.a;
}
}d[N];
int main(){
scanf("%d%d",&n,&k);
lt.st.newst(k);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&d[i].a,&d[i].b,&d[i].c);
d[i].i=i;
}std::sort(d+1,d+n+1);
for(int i=1;i<=n;i++){
int r=i;
while(d[r+1].a==d[r].a)r++;
for(int j=i;j<=r;j++)lt.add(d[j].b,d[j].c,1);
for(int j=i;j<=r;j++)ans[lt.sum(d[j].b,1,d[j].c)-1]++;
i=r;
}for(int i=0;i<n;i++)printf("%d\n",ans[i]);
return 0;
}