测试样例:
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;
}