Pagini recente » Cod sursa (job #1812658) | Cod sursa (job #2258340) | Cod sursa (job #1673090) | Cod sursa (job #2390976) | Cod sursa (job #1527743)
/**
Let A be a sequence of N natural numbers. On it, M operations will be made of the following format:
0 a b - Print the maximum number from interval [Aa, Ab]
1 a b - Aa = b
**/
#include <cstdio>
#include <algorithm>
#define NMAX 400005
using namespace std;
int N, M, a, b;
int tree[NMAX], maximum;
void update(int vertex, int left, int right) {
if (left == right) {
tree[vertex] = b;
return;
}
int mid = (left + right) / 2;
if (a <= mid) {
update(2 * vertex, left, mid);
}
else {
update(2 * vertex + 1, mid + 1, right);
}
tree[vertex] = max(tree[2 * vertex], tree[2 * vertex + 1]);
}
void query(int vertex, int left, int right) {
if (a <= left && right <= b) {
maximum = max(maximum, tree[vertex]);
return;
}
int mid = (left + right) / 2;
if (a <= mid) {
query(2 * vertex, left, mid);
}
if (b > mid) {
query(2 * vertex + 1, mid + 1, right);
}
}
void read() {
scanf("%d %d", &N, &M);
for (a = 1; a <= N; ++a) {
scanf("%d", &b);
update(1, 1, N);
}
}
void solve() {
int operationType;
for (int i = 1; i <= M; ++i) {
scanf("%d %d %d", &operationType, &a, &b);
if (operationType == 0) {
maximum = 0;
query(1, 1, N);
printf("%d\n", maximum);
}
else {
update(1, 1, N);
}
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
read();
solve();
}