SegmentTree

区间最大值

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
class SegTreeMax {
public:
struct node {
int l, r;
int v;
};
int N = 1e5+10;
vector<node> tr;
SegTreeMax(int x) : N(x){
tr.resize(4*N);
build(1, 1, N);
};
void build(int u, int l, int r) {
tr[u] = {l, r};
if(l == r) return ;
int mid = (l + r) >> 1;
build(u << 1, l, mid); build(u << 1 | 1, mid+1, r);
}
void pushup(int u) {
tr[u].v = max(tr[u<<1].v, tr[u<<1|1].v);
}
// x 位置插入 w
void modify(int u, int x, int w) {
if(tr[u].l == x && tr[u].r == x) tr[u].v = w;
else {
int mid = (tr[u].l + tr[u].r) >> 1;
if(x <= mid) modify(u<<1, x, w);
else modify(u<<1|1, x, w);
pushup(u);
}
}
// l r之间最大的数
int query(int u, int l, int r){
// 全包含,同时时递归出口
if(tr[u].l >= l && tr[u].r <= r) return tr[u].v;
// mid时归于左边
int mid = (tr[u].l + tr[u].r) >> 1, ans = 0;
if(l <= mid) ans = query(u<<1, l, r);
if(r > mid) ans = max(ans, query(u<<1|1, l, r));
return ans;
}
};