#include <cstdio>
#define MAXN 100000
int v[4*MAXN+66];
void Update(int node, int lf, int rg, int a, int b, int val){
if(a <= lf && rg <= b){
v[node] = val;
return;
} else {
int mid = lf+(rg-lf)/2;
if(a <= mid)
Update(2*node, lf, mid, a, b, val);
if(b > mid)
Update(2*node+1, mid+1, rg, a, b, val);
v[node]=(v[2*node]>v[2*node+1])? v[2*node]: v[2*node+1];
}
}
void Query(int node, int lf, int rg, int a, int b, int& max){
int aux;
if(a <= lf && rg <= b){
if(max < v[node])
max = v[node];
return;
} else {
int mid = lf+(rg-lf)/2;
if(a <= mid)
Query(2*node, lf, mid, a, b, max);
if(b > mid)
Query(2*node+1, mid+1, rg, a, b, max);
}
}
int main(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, M, i, a, b, aux;
scanf("%d%d", &N, &M);
for(i = 1; i <= N; i++){
scanf("%d", &aux);
Update(1, 1, N, i, i, aux);
}
for(i = 1; i <= M; i++){
scanf("%d%d%d", &aux, &a, &b);
if(aux)
Update(1, 1, N, a, a, b);
else {
aux = 0;
Query(1, 1, N, a, b, aux);
printf("%d\n", aux);
}
}
return 0;
}