#include<cstdio>
int n,m,i,j,q,a,b,s,v[300100];
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;
}
int mid=(l+r)>>1;
if(p<=mid)
upd( (nod<<1), l, mid, p, x );
else
upd( (nod<<1)+1, mid+1, r, 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&&r<=b){
s=maxim(s,v[nod]);
return;
}
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,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&a);
upd(1,1,n,i,a);
}
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&q,&a,&b);
if(q==1)
upd(1,1,n,a,b);
if(q==0){
s=0;
query(1,1,n,a,b);
fprintf(g,"%d\n",s);
}
}
fclose(f);
fclose(g);
return 0;
}