#include <stdio.h>
#define DIM 262144
int A[DIM], n, m, maxim;
inline int Max(int a, int b){
return a>b?a:b;
}
void update(int nod, int st, int dr, int poz, int val){
if(st == dr){
A[nod] = val;
}
else {
int m = (st+dr)/2;
if(poz <= m) update(2*nod, st, m, poz, val);
else update(2*nod+1, m+1, dr, poz, val);
A[nod] = Max(A[2*nod], A[2*nod+1]);
}
}
int query(int nod, int st, int dr, int a, int b){
if(a<=st && dr<=b)
{if(A[nod]>maxim) maxim=A[nod];}
else{
int m = (st+dr)/2, v1=0, v2=0;
if(a<=m) v1 = query(2*nod, st, m, a, b);
if(b>m) v2 = query(2*nod+1, m+1, dr, a, b);
//return Max(v1, v2);
}
}
int main(){
int i, u, v, t;
FILE *f=fopen("arbint.in", "r");
FILE *g=fopen("arbint.out", "w");
fscanf(f, "%d %d", &n, &m);
for(i=1; i<=n; i++){
fscanf(f, "%d", &u);
update(1, 1, n, i, u);
}
for(i=1; i<=m; i++){
fscanf(f, "%d %d %d", &t, &u, &v);
if(t==1) update(1, 1, n, u, v);
else {maxim=-1; query(1, 1, n, u, v); fprintf(g, "%d\n", maxim); }
}
fclose(f);
fclose(g);
return 0;
}