#include <algorithm>
#include <stdio.h>
const int MAX_N = 100000;
int N, ArbInt[4 * MAX_N];
void update(int nod, int st, int dr, int i, int val) {
if (st == dr) {
ArbInt[nod] = val;
} else {
int mid = (st + dr) / 2;
if (i <= mid)
update(2 * nod, st, mid, i, val);
else
update(2 * nod + 1, mid + 1, dr, i, val);
ArbInt[nod] = std::max(ArbInt[2 * nod], ArbInt[2 * nod + 1]);
}
}
void update(int i, int val) {
update(1, 1, N, i, val);
}
int query(int nod, int st, int dr, int begin, int end) {
if (begin <= st && dr <= end)
return ArbInt[nod];
int mid = (st + dr) / 2;
int ans = 0;
if (begin <= mid)
ans = std::max(ans, query(2 * nod, st, mid, begin, end));
if (mid < end)
ans = std::max(ans, query(2 * nod + 1, mid + 1, dr, begin, end));
return ans;
}
int query(int begin, int end) {
return query(1, 1, N, begin, end);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int Q;
scanf("%d%d", &N, &Q);
int a[1 + N];
for (int i = 1; i <= N; i++) {
scanf("%d", &a[i]);
update(i, a[i]);
}
for (int q = 0; q < Q; q++) {
int c, a, b;
scanf("%d%d%d", &c, &a, &b);
if (c == 0)
printf("%d\n", query(a, b));
else
update(a, b);
}
fclose(stdin);
fclose(stdout);
return 0;
}