线段树

区间最大值

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;
}
posted @ 2020-11-21 09:14  C2022lihan  阅读(25)  评论(0编辑  收藏  举报