#include <bits/stdc++.h>
using namespace std;
#define NMAX 100005
#define problem "arbint"
int n, seg_tree[4 * NMAX];
void update(int pos, int val, int current = 1, int current_left = 1, int current_right = n) {
if (current_left == current_right)
seg_tree[current] = val;
else {
int mid = current_left + (current_right - current_left) / 2;
if (pos <= mid)
update(pos, val, 2 * current, current_left, mid);
else
update(pos, val, 2 * current + 1, mid + 1, current_right);
seg_tree[current] = max(seg_tree[2 * current], seg_tree[2 * current + 1]);
}
}
int query(int left, int right, int current = 1, int current_left = 1, int current_right = n) {
if (left <= current_left && current_right <= right)
return seg_tree[current];
int mid = current_left + (current_right - current_left) / 2,
left_ans = INT_MIN, right_ans = INT_MIN;
if (left <= mid)
left_ans = query(left, right, current * 2, current_left, mid);
if (right >= mid + 1)
right_ans = query(left, right, current * 2 + 1, mid + 1, current_right);
return max(left_ans, right_ans);
}
int main()
{
freopen(problem ".in", "r", stdin);
freopen(problem ".out", "w", stdout);
int m;
scanf("%d%d", &n, &m);
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
update(i, x);
}
for (int i = 1, c, a, b; i <= m; ++i) {
scanf("%d%d%d", &c, &a, &b);
if (c == 0)
printf("%d\n", query(a, b));
else
update(a, b);
}
}