#include<stdio.h>
#define dim 100001
#define maxim(a, b) a>b?a:b
using namespace std;
int A[dim], max;
void update(int nod, int st, int dr, int pos, int val)
{ int mij;
if(st == dr) { A[nod] = val; return;}
mij = (st + dr) / 2;
if(pos <= mij) update(nod*2, st, mij, pos, val);
else if(pos > mij) update(nod*2 +1, mij+1, dr, pos, val);
A[nod] = maxim(A[nod*2], A[nod*2+1]);
}
void query(int nod, int st, int dr, int a, int b)
{ int mij;
if((a <= st) && (dr <= b)) {
if(max < A[nod]) max = A[nod];
return;
}
mij = (st + dr) /2;
if(a <= mij) query(nod*2, st, mij, a, b);
if(b > mij) query(nod*2+1, mij+1, dr, a, b);
}
int main()
{ int N, M, i, x, a, b;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for(i = 1; i <= N; i++){
scanf("%d", &x);
update(1, 1, N, i, x);
}
for(i = 1; i <= M; i++){
scanf("%d %d %d", &x, &a, &b);
if(x == 0){
max = 0;
query(1, 1, N, a, b);
printf("%d\n", max);
}
else if(x == 1){
update(1, 1, N, a, b);
}
}
return 0;
}