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
| inline void updatemax(ll &x,ll y){x=max(x,y);}
const int maxsq=(1<<9)+15,sq=(1<<9); int lowbits,highbits; ll mx[maxsq][maxsq]; inline void update(int x,ll val){ lowbits=x&(sq-1);highbits=(x>>9); for(int j=highbits;j<sq;j=(j+1)|highbits){ updatemax(mx[j][lowbits],val); } } inline void clear(int x){ lowbits=x&(sq-1);highbits=(x>>9); for(int j=highbits;j<sq;j=(j+1)|highbits){ mx[j][lowbits]=0; } } inline ll query(int x){ ll res=0; lowbits=x&(sq-1),highbits=(x>>9); for(int j=lowbits;;j=(j-1)&lowbits){ updatemax(res,mx[highbits][j]); if(j==0) break; } return res; }
void solve(int l,int r){ if(l==r) return; int mid=(l+r)>>1; solve(l,mid); sort(a+l,a+mid+1,[](Node x,Node y){return x.w>y.w;}); sort(a+mid+1,a+r+1,[](Node x,Node y){return x.w>y.w;});
int i=l; for(int j=mid+1;j<=r;++j){ ll S=a[j].S; while(i<=mid&&a[i].w+w>=a[j].w){ update(a[i].S,ans[a[i].id]); ++i; } ll res=query(S); updatemax(ans[a[j].id],res+a[j].val); } for(int j=l;j<i;++j) clear(a[j].S);
sort(a+l,a+mid+1,[](Node x,Node y){return x.id<y.id;}); sort(a+mid+1,a+r+1,[](Node x,Node y){return x.id<y.id;}); solve(mid+1,r); }
|