(以线段树-区间修改为例,假如是单点修改只需要把PushDown去掉)
可以解决形如:
无序数组中第一个大于等于x的值的位置
pair<int, ll> LowerBound(int u, int l, int r, ll x) {
pair<int, ll> res = {-1, -LINF};
if(mx[u] < x)
return res;
if(l == r)
return res = {l, mx[u]};
PushDown(u, l, r);
if(mx[ls] >= x) return LowerBound(ls, l, mid, x);
return LowerBound(rs, mid + 1, r, x);
}
pair<int, ll> UpperBound(int u, int l, int r, ll x) {
pair<int, ll> res = {-1, -LINF};
if(mx[u] <= x)
return res;
if(l == r)
return res = {l, mx[u]};
PushDown(u, l, r);
if(mx[ls] > x) return UpperBound(ls, l, mid, x);
return UpperBound(rs, mid + 1, r, x);
}
进入两个分支的条件还可以更加复杂,例如规定必须在某个区间中查找,这个时候要搭配上面的QueryMax来找到半个区间中的最值。