线段树 查询区间最值(模板)

测试样例:

Input:
20 3
4582 370 8241 6956 5924 3427 8388 1936 557 2029 5501 2569 3186 3329 793 981 6039 8262 4956 3116
0 19
0 5
10 19
0 19
0 5
10 19
Output:
Before update:
8388
8241
8262
After update:
99999999
10000000
99999999

Code:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>

using namespace std;

const int maxn = 100007;
const int inf = 0x7f7f7f7f;
int n, m;
int tree[4*maxn];
int arr[maxn];
void build_tree(int node, int left, int right) {
    
    //ind:index in array tree[]
	if (left == right) {
    
    
		tree[node] = arr[left];
	} else {
    
    
		int mid = (left + right) >> 1;
		int left_node = 2*node + 1, right_node = 2*node + 2;
		build_tree(left_node, left, mid);
		build_tree(right_node, mid + 1, right);
		tree[node] = max(tree[left_node], tree[right_node]);
	}
}
void update_tree(int node, int left, int right, int idx, int val) {
    
    //node:index in array tree[], idx:index in array arr[]
	if (left == right) {
    
    
		arr[idx] = val;
		tree[node] = val;
	} else if (idx < left || idx > right) {
    
    
		return;
	} else {
    
    
		int mid = (left + right) >> 1;
		int left_node = 2*node + 1, right_node = 2*node + 2;
		if (idx >= left && idx <= mid) {
    
    
			update_tree(left_node, left, mid, idx, val);
		} else {
    
    
			update_tree(right_node, mid + 1, right, idx, val);
		}
		tree[node] = max(tree[left_node], tree[right_node]);
	}
}
int query_tree(int node, int left, int right, int from, int to) {
    
    //query the max value from 'from' to 'to'
	if (to < left || from > right) {
    
    
		return -inf;
	} else if (from <= left && right <= to) {
    
    
		return tree[node];
	} else {
    
    
		int mid = (left + right) >> 1;
		int left_node = 2*node + 1, right_node = 2*node + 2;
		return max(query_tree(left_node, left, mid, from, to), query_tree(right_node, mid + 1, right, from, to));
	}
}
int main()
{
    
    
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int from, to;
	cin>>n>>m;
	for (int i=0;i<n;i++) {
    
    
		cin>>arr[i];
	}
	build_tree(0, 0, n - 1);
	cout<<"Before update: "<<endl;
	for (int i=0;i<m;i++) {
    
    
		cin>>from>>to;
		cout<<query_tree(0, 0, n - 1, from, to)<<endl;
	}
	update_tree(0, 0, n-1, 0, 10000000);//change arr[0] to 10000000
	update_tree(0, 0, n-1, 17, 99999999);//change arr[17] to 99999999
	cout<<"After update: "<<endl;
	for (int i=0;i<m;i++) {
    
    
		cin>>from>>to;
		cout<<query_tree(0, 0, n - 1, from, to)<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u010017231/article/details/105210897
今日推荐