#include<cstdio>
#include<algorithm>
#define Nmax 100010
using namespace std;
int N,M,v[2*Nmax],st_a,val,A,B,maxim;
void update(int nod, int st,int dr){
if(st==dr){
v[nod]=val;
return;}
int mij=(st+dr)/2;
if(st_a <=mij) update(2*nod,st,mij);
else update(2*nod+1,mij+1,dr);
v[nod]=max( v[2*nod],v[2*nod+1] );
}
void inter(int nod,int st,int dr){
if( A<=st && dr<=B){
if(maxim< v[nod])
maxim=v[nod];
return;
}
int mij=(st+dr)/2;
if(A <=mij) inter(2*nod,st,mij);
if(B> mij) inter(2*nod+1,mij+1,dr);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;++i){
int x;
scanf("%d",&x);
val=x;
st_a=i;
update(1,1,N);
}
for(int i=1;i<=M;++i){
int tip;
scanf("%d%d%d",&tip,&A,&B);
switch(tip){
case 0:
maxim=0;
inter(1,1,N);
printf("%d\n",maxim);
break;
case 1:
val=B;
st_a=A;
update(1,1,N);
break;
}
}
return 0;
}