#include <iostream>
using namespace std;
#define NMAX 100001
#define NMAXX 200002
long q,w,a,b,i,n,m,v[NMAX],t[NMAXX];
void build(long k, long beg, long end){
if (beg==end){
t[k]=v[beg];
return;
}
build(2*k,beg,(beg+end)/2);
build(2*k+1,(beg+end)/2+1,end);
if (t[k*2]>=t[k*2+1])
t[k]=t[k*2];
else
t[k]=t[k*2+1];
}
void build2(long k, long beg, long end){
if (beg==end){
t[k]=b;
return;
}
if (a<=(beg+end)/2)
build2(2*k,beg,(beg+end)/2);
else
build2(2*k+1,(beg+end)/2+1,end);
if (t[k*2]>=t[k*2+1])
t[k]=t[k*2];
else
t[k]=t[k*2+1];
}
long maxq (long k, long beg, long end){
if (a>end || b<beg){
return -1;
}
if (a<=beg && end<=b){
return t[k];
}
long x=maxq(2*k,beg,(beg+end)/2);
long y=maxq(2*k+1,(beg+end)/2+1,end);
if (x>=y)
return x;
else
return y;
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w", stdout);
scanf("%ld %ld",&n,&m);
for (i=1; i<=n; i++){
scanf("%ld ", &b);
a=i;
build2(1,1,n);
}
for (w=1; w<=m; w++){
scanf ("%ld %ld %ld" ,&q,&a,&b);
if (q==0){
printf("%ld\n", maxq(1,1,n));
}
if (q==1){
build2(1,1,n);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}