#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100001;
int val[4 * MAXN];
void update(int, int, int, int, int);
int query(int, int, int, int, int);
void update(int node, int left, int right, int id, int x)
{
if (left == right) {
val[node] = x;
} else {
int mid = (left + right) / 2;
if (id <= mid)
update(2 * node, left, mid, id, x);
else
update(2 * node + 1, mid + 1, right, id, x);
val[node] = max(val[2 * node], val[2 * node + 1]);
}
}
int query(int node, int left, int right, int a, int b)
{
if (a <= left && right <= b) {
return val[node];
} else {
int mid = (left + right) / 2;
int lres = 0, rres = 0;
if (a <= mid)
lres = query(2 * node, left, mid, a, b);
if (b > mid)
rres = query(2 * node + 1, mid + 1, right, a, b);
return max(lres, rres);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int x, N, M;
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; ++i) {
scanf("%d", &x);
update(1, 1, N, i, x);
}
int a, b, code;
for (int i = 0; i < M; ++i) {
scanf("%d %d %d", &code, &a, &b);
if (code == 0) {
printf("%d\n", query(1, 1, N, a, b));
} else {
update(1, 1, N, a, b);
}
}
return 0;
}