1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
using namespace std; long long n,k,kl,C[maxn],A[maxn],nn[maxn]; struct ss { long long a,b,c,num,id; }e[maxn],B[maxn]; inline bool mycmp(ss a1,ss a2){ if(a1.a!=a2.a)return a1.a<a2.a; else if(a1.b!=a2.b)return a1.b<a2.b; return a1.c<a2.c;} inline bool cmp(ss a1, ss a2){return a1.id<a2.id;} inline void copy(int q1,int q2){B[q1].a=e[q2].a;B[q1].b=e[q2].b;B[q1].c=e[q2].c;B[q1].id=e[q2].id;B[q1].num=e[q2].num;} inline int lowbit(int kk){return kk&(-kk);} int add(int yu,int kk){for(int kl=yu;kl<=k;kl+=lowbit(kl))C[kl]+=kk;return 0;} int Find(int kk){int sum=0;for(int kl=kk;kl>0;kl-=lowbit(kl))sum+=C[kl];return sum;} inline void merge(int ll,int rr) { if(ll+1==rr) { if(e[rr].b<e[ll].b)B[++kl]=e[rr],e[rr]=e[ll],e[ll]=B[kl]; kl=0;return ; } int mid=(ll+rr)/2;kl=0; for(int i=ll,j=mid+1;kl<=(rr-ll+1);) { while(i==mid+1){if(j==rr+1)break;copy(++kl,j++);} while(j==rr+1){if(i==mid+1)break;copy(++kl,i++);} if(e[i].b<=e[j].b&&i<=mid){copy(++kl,i++);} else if(j<=rr){copy(++kl,j++);} else break; }//cout<<ll<<' '<<rr<<'-'<<kl<<endl; for(int i=1;i<=kl;i++)e[i+ll-1]=B[i]; //cout<<ll<<'-'<<rr<<'='<<kl<<':';for(int i=1;i<=kl;i++)cout<<e[i+ll-1].b<<' ';cout<<endl; return ; } inline void slove(int ll,int rr) { int mid=(ll+rr)/2,ans=0; for(int i=mid+1,j=ll;i<=rr;i++) { while(e[j].b<=e[i].b&&j<=mid)add(e[j].c,e[j].num),j++; A[e[i].id]+=Find(e[i].c); } //for(int i=1;i<=k;i++)cout<<C[i]<<' ';cout<<endl; for(int i=mid+1,j=ll;i<=rr;i++)while(e[j].b<=e[i].b&&j<=mid)add(e[j].c,(0-e[j].num)),j++; } inline int cdq(int ll,int rr) { if(ll==rr)return 0; int mid=(ll+rr)/2,ans=0; ans+=cdq(ll,mid); ans+=cdq(mid+1,rr); slove(ll,rr); //cout<<ll<<' '<<rr<<'\n'; //for(int i=1;i<=n;i++)cout<<A[e[i].id]<<' ';cout<<'\n'; //for(int i=1;i<=n;i++)cout<<e[i].a<<' ';cout<<'\n'; //for(int i=1;i<=n;i++)cout<<e[i].b<<' ';cout<<'\n'; //for(int i=1;i<=n;i++)cout<<e[i].c<<' ';cout<<'\n'; //for(int i=19;i<=n;i++)cout<<e[i].num<<' ';cout<<'\n'; //for(int i=1;i<=n;i++)cout<<e[i].id<<' ';cout<<'\n'; merge(ll,rr); return ans; } int main() { memset(e,10,sizeof(e)); scanf("%lld%lld",&n,&k); int yu=0; for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&e[i].a,&e[i].b,&e[i].c),e[i].num=1,e[i].id=i; sort(e+1,e+n+1,mycmp); for(int i=1;i<=n;i++) if(e[i].a==e[i-1].a&&e[i].b==e[i-1].b&&e[i].c==e[i-1].c) { e[i].num+=e[i-1].num; e[i-1]=e[0]; yu++; } sort(e+1,e+n+1,mycmp); n-=yu; cdq(1,n); //for(int i=1;i<=n;i++)cout<<A[e[i].id+e[i].num-1]<<' ';cout<<'\n'; for(int i=1;i<=n;i++)nn[A[e[i].id]+e[i].num-1]+=e[i].num; n+=yu; for(int i=0;i<n;i++)printf("%lld\n",nn[i]); return 0; }
|