#include<cstdio>
int n,q,v[300000],i,j,op,a,b,sol;
FILE *f,*g;
int maxim(int a,int b){
if(a>b)
return a;
return b;
}
void upd(int nod,int l,int r,int p,int x){
if(l==r){
v[nod]=x;
return;
}
else{
int mid=((l+r)>>1);
if(p>mid)
upd((nod<<1)+1,mid+1,r,p,x);
else
upd((nod<<1),l,mid,p,x);
v[nod]=maxim(v[(nod<<1)],v[(nod<<1)+1]);
}
}
void query(int nod,int l,int r,int a,int b){
if(a<=l&&b>=r){
sol=maxim(sol,v[nod]);
return;
}
else{
int mid=((l+r)>>1);
if(a<=mid)
query((nod<<1),l,mid,a,b);
if(b>mid)
query((nod<<1)+1,mid+1,r,a,b);
}
}
int main(){
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%d%d",&n,&q);
for(i=1;i<=n;i++){
fscanf(f,"%d",&a);
upd(1,1,n,i,a);
}
for(i=1;i<=q;i++){
fscanf(f,"%d%d%d",&op,&a,&b);
if(op==1)
upd(1,1,n,a,b);
else{
sol=-2000000000;
query(1,1,n,a,b);
fprintf(g,"%d\n",sol);
}
}
fclose(f);
fclose(g);
return 0;
}