#include <cstdio>
#include <algorithm>
using namespace std;
const int maxN = 131072;
int arb[maxN << 1];
int v[maxN];
void build(int nod, int st, int dr) {
if(st == dr)
arb[nod] = v[st];
else {
int mid = (st + dr) >> 1, k = nod << 1;
build(k, st, mid);
build(k + 1, mid + 1, dr);
arb[nod] = max(arb[k], arb[k + 1]);
}
}
void update(int nod, int val, int pos, int st, int dr) {
if(st == dr)
arb[nod] = val;
else {
int mid = (st + dr) >> 1, k = nod << 1;
if(pos <= mid)
update(k, val, pos, st, mid);
else
update(k + 1, val, pos, mid + 1, dr);
arb[nod] = max(arb[k], arb[k + 1]);
}
}
int query(int nod, int x, int y, int st, int dr) {
if(x <= st and dr <= y)
return arb[nod];
else {
int mid = (st + dr) >> 1, k = nod << 1;
int ans = 0;
if(x <= mid)
ans = max(ans, query(k, x, y, st, mid));
if(y > mid)
ans = max(ans, query(k + 1, x, y, mid + 1, dr));
return ans;
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, M;
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++ i)
scanf("%d", &v[i]);
int p;
for(p = 1; p < N; p <<= 1);
build(1, 1, p);
for(int i = 1; i <= M; ++ i) {
int op, a, b;
scanf("%d %d %d", &op, &a, &b);
if(op == 0)
printf("%d\n", query(1, a, b, 1, p));
else
update(1, b, a, 1, p);
}
return 0;
}