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

测试样例:

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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值