#include <iostream>
using namespace std;
#define NMAX 100001
#define NMAXX 400004
int q,w,a,b,i,n,m,v[NMAX],t[NMAXX];
void build(int k, int beg, int 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(int k, int beg, int 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];
}
int maxq (int k, int beg, int end){
if (a>end || b<beg){
return -1;
}
if (a<=beg && end<=b){
return t[k];
}
int x=maxq(2*k,beg,(beg+end)/2);
int 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("%d %d",&n,&m);
for (i=1; i<=n; i++){
scanf("%d ", &v[i]);
}
build(1,1,n);
for (w=1; w<=m; w++){
scanf ("%d %d %d" ,&q,&a,&b);
if (q==0){
printf("%d\n", maxq(1,1,n));
}
if (q==1){
build2(1,1,n);
}
}
return 0;
}