线段树
区间最大值
struct Segment_Tree {
int l, r;
int Max_Date;
}Seg_Tr[MAXN * 4];
int Max (int x, int y) { return x > y ? x : y; }
void _Build (int p, int l, int r) {
Seg_Tr[p].l = l;
Seg_Tr[p].r = r;
if (l == r) {
Seg_Tr[p].Max_Date = a[l];
return;
}
int mid = l + r >> 1;
_Build (p << 1, l, mid);
_Build (p << 1 | 1, mid + 1, r);
Seg_Tr[p].Max_Date = Max (Seg_Tr[p << 1].Max_Date, Seg_Tr[p << 1 | 1].Max_Date);
}
void _Update (int p, int Index, int val) {
if (Seg_Tr[p].l == Seg_Tr[p].r) {
Seg_Tr[p].Max_Date = val;
return;
}
int mid = Seg_Tr[p].l + Seg_Tr[p].r >> 1;
if (Index <= mid)
_Update (p << 1, Index, val);
else
_Update (p << 1 | 1, Index, val);
Seg_Tr[p].Max_Date = Max (Seg_Tr[p << 1].Max_Date, Seg_Tr[p << 1 | 1].Max_Date);
}
int _Query (int p, int l, int r) {
if (l <= Seg_Tr[p].l && Seg_Tr[p].r <= r) return Seg_Tr[p].Max_Date;
int mid = Seg_Tr[p].l + Seg_Tr[p].r >> 1;
int val = -INF;
if (l <= mid)
val = Max (val, _Query (p << 1, l, r));
if (r >= mid + 1)
val = Max (val, _Query (p << 1 | 1, l, r));
return val;
}