要线段树资瓷区间max和询问区间和。
设要把$[L, R]$对mx取max。
我们可以在线段树上二分出小于mx的区间然后变成区间修改了。
具体实现是,维护区间最小值和区间最大值,我们递归进入一个区间,如果这个区间的最小值都大于mx的话就不用管这个区间了。
然后我们假设找到了一个区间被$[L, R]$包含,那么如果这个区间的最大值小于mx,就直接修改,否则再递归进入他的子区间进行查找。
void change(int l, int r, int o, int ql, int qr, int c) { if (mn[o] >= c) return ; if (l >= ql and r <= qr) { if (mx[o] <= c) { mx[o] = mn[o] = lzy[o] = c; tr[o] = (r - l + 1) * c; return ; } } spread(o, l, r);//下放标记 int mid = (l + r) >> 1; if (ql <= mid) change(l, mid, ls, ql, qr, c); if (qr > mid) change(mid + 1, r, rs, ql, qr, c); pushup(o); }