修改和查询的时候,能不重排就不重排。
76pts:
inline int query(int l,int r,int x) {
int ans=-inf;
if (B[l]!=B[r]) {
_rep(i,B[l]+1,B[r]-1) {
int p=lower_bound(arr+L[i],arr+R[i]+1,pii{x-tag[i],114514LL},cmp)-(arr+1);
if (p<L[i]) continue;
ans=max(ans,max(pre[p],arr[p].first+taghis[i]));
}
pushtag(B[l]),pushtag(B[r]);
rebuild(B[l]),rebuild(B[r]);
_rep(i,l,R[B[l]]) if (a[i]<x) ans=max(ans,his[i]);
_rep(i,L[B[r]],r) if (a[i]<x) ans=max(ans,his[i]);
} else {
pushtag(B[l]);
rebuild(B[l]);
_rep(i,l,r) if (a[i]<x) ans=max(ans,his[i]);
}
return ans;
}
100pts:
inline int query(int l,int r,int x) {
int ans=-inf;
if (B[l]!=B[r]) {
_rep(i,B[l]+1,B[r]-1) {
int p=lower_bound(arr+L[i],arr+R[i]+1,pii{x-tag[i],114514LL},cmp)-(arr+1);
if (p<L[i]) continue;
ans=max(ans,max(pre[p],arr[p].first+taghis[i]));
}
_rep(i,l,R[B[l]]) if (a[i]+tag[B[i]]<x) ans=max(ans,max(his[i],a[i]+taghis[B[i]]));
_rep(i,L[B[r]],r) if (a[i]+tag[B[i]]<x) ans=max(ans,max(his[i],a[i]+taghis[B[i]]));
} else {
_rep(i,l,r) if (a[i]+tag[B[i]]<x) ans=max(ans,max(his[i],a[i]+taghis[B[i]]));
}
return ans;
}