voidcdq(int l,int r){ if (l==r) return; int mid=(l+r)>>1; cdq(l,mid); cdq(mid+1,r); sort(e+l,e+mid+1,cmp2); sort(e+mid+1,e+r+1,cmp2); int j=l; for (int i=mid+1;i<=r;i++) { while (j<=mid and e[j].b<=e[i].b) { upd(e[j].c,e[j].cnt); j++; } e[i].ans+=ask(e[i].c); } for (int i=l;i<j;i++) upd(e[i].c,-e[i].cnt); }
voidcdq2(int l,int r){ if (l==r) return; int mid=(l+r>>1); cdq2(l,mid); sort(e+l,e+mid+1,cmp3); sort(e+mid+1,e+r+1,cmp3); int i=l,j=mid+1; while (i<=mid and j<=r) { if (e[i].v3<=e[j].v3) { if (!e[i].ok) upd(e[i].v4,e[i].ans); i++; } else { if (e[j].ok) e[j].ans=max(e[j].ans,ask(e[j].v4)+e[j].val); j++; } } while (i<=mid) { if (!e[i].ok) upd(e[i].v4,e[i].ans); i++; } while (j<=r) { if (e[j].ok) e[j].ans=max(e[j].ans,ask(e[j].v4)+e[j].val); j++;} for (int k=l;k<i;k++) if(!e[k].ok) clear(e[k].v4); for (int i=l;i<=r;i++) t[id2[e[i].id]]=e[i]; for (int i=l;i<=r;i++) e[i]=t[i]; cdq2(mid+1,r); }
voidcdq1(int l,int r){ if (l==r) return; int mid=(l+r>>1); cdq1(l,mid); for (int i=l;i<=mid;i++) e[i].ok=0; for (int i=mid+1;i<=r;i++) e[i].ok=1; sort(e+l,e+r+1,cmp2); for (int i=l;i<=r;i++) id2[e[i].id]=i; cdq2(l,r); for (int i=l;i<=r;i++) t[id1[e[i].id]]=e[i]; for (int i=l;i<=r;i++) e[i]=t[i]; cdq1(mid+1,r); }