#include <cstdio>
using namespace std;
int N, M;
int A[100001];
int ai[100001];
int c, a, b;
int recalc(int a, int b, int poz) {
if(a == b)
return ai[poz] = A[a];
else {
int x, y;
x = recalc(a, (a + b) / 2, poz * 2);
y = recalc((a + b) / 2 + 1, b, poz * 2 + 1);
return ai[poz] = (x > y ? x : y);
}
}
int change(int a, int b, int x, int poz) {
if(a == b) {
ai[poz] = x;
return x;
}
int tmp, tmp2;
if(x > (a + b + 1) / 2) {
tmp = change((a + b) / 2 + 1, b, x, 2 * poz + 1);
tmp2 = ai[2 * poz];
} else {
tmp = change(a, (a + b) / 2, x, 2 * poz);
tmp2 = ai[2 * poz + 1];
}
if(tmp > tmp2)
ai[poz] = tmp;
else ai[poz] = tmp2;
return ai[poz];
}
int query(int a, int b, int st, int dr, int poz) {
int rez, x;
if(st == dr)
return ai[poz];
if(a <= st && b >= dr)
return ai[poz];
int med;
med = (st + dr) / 2;
if(a <= med && b > med) {
rez = query(a, b, st, med, 2 * poz);
x = query(a, b, med + 1, dr, 2 * poz + 1);
if(x > rez)
rez = x;
return rez;
} else if(b <= med)
return query(a, b, st, med, 2 * poz);
else return query(a, b, med + 1, dr, 2 * poz + 1);
}
int main() {
int i, j;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for(i = 1; i <= N; i++)
scanf("%d", &A[i]);
recalc(1, N, 1);
for(i = 1; i <= M; i++) {
scanf("%d %d %d", &c, &a, &b);
if(c == 1) {
change(1, N, a, 1);
} else {
printf("%d\n", query(a, b, 1, N, 1));
}
}
return 0;
}