#include <cstdio>
#define MAXN 100000
int aint[4*MAXN+1];
inline int getmax(int a,int b){
if(a<b) return b;
return a;
}
void update(int nod,int left,int right,int poz,int val){
if(left==right)
aint[nod]=val;
else{
int mid=(left+right)/2;
if(poz<=mid)
update(2*nod,left,mid,poz,val);
else
update(2*nod+1,mid+1,right,poz,val);
aint[nod]=getmax(aint[2*nod+1],aint[2*nod]);
}
}
int max;
void querry(int nod,int left,int right,int l,int r){
if(l<=left&&right<=r){
if(max<aint[nod])
max=aint[nod];
}
else{
int mid=(left+right)/2;
if(l<=mid)
querry(2*nod,left,mid,l,r);
if(mid<r)
querry(2*nod+1,mid+1,right,l,r);
}
}
int main(){
FILE*fi,*fout;
int i,n,m,t,a,b,nr;
fi=fopen("arbint.in" ,"r");
fout=fopen("arbint.out" ,"w");
fscanf(fi,"%d%d" ,&n,&m);
for(i=1;i<=n;i++){
fscanf(fi,"%d" ,&nr);
update(1,1,n,i,nr);
}
for(i=0;i<m;i++){
fscanf(fi,"%d%d%d" ,&t,&a,&b);
if(t==0){
max=0;
querry(1,1,n,a,b);
fprintf(fout,"%d\n" ,max);
}
else
update(1,1,n,a,b);
}
fclose(fi);
fclose(fout);
return 0;
}