Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void cdq(V<point>& v,int l,int r){
- if(r-l==1) return;
- int m=(l+r)>>1;
- cdq(v,l,m),cdq(v,m,r);
- node* root=nullptr;
- for(int lp=l,rp=m;rp<r;rp++){
- while(lp<m&&v[lp].y>v[rp].y){
- node *tl,*tr;
- split(root,v[lp].z,tl,tr);
- root=merge(merge(tl,new node(v[lp].z)),tr);
- lp++;
- }
- node *tl,*tr;
- split(root,v[rp].z,tl,tr);
- v[rp].ans+=(tl?tl->sz:0);
- root=merge(tl,tr);
- }
- static V<point> tmp;
- tmp.resize(v.size());
- copy(v.cbegin()+l,v.cbegin()+r,tmp.begin()+l);
- int lp=l,rp=m;
- while(lp<m&&rp<r)
- if(tmp[lp].y>tmp[rp].y)
- v[l++]=tmp[lp++];
- else
- v[l++]=tmp[rp++];
- while(lp<m)
- v[l++]=tmp[lp++];
- while(rp<r)
- v[l++]=tmp[rp++];
- }
- inline void solve(){
- int n;cin>>n;
- V<point> v(n);
- for(int i=0;i<n;i++)
- v[i].i=i,cin>>v[i].x>>v[i].y>>v[i].z;
- sort(v.begin(),v.end());
- cdq(v,0,n);
- sort(v.begin(),v.end(),[](point a,point b){
- return a.i<b.i;
- });
- for(auto i:v)
- cout<<i.ans<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment