#include<cstdio>
long a[100010],arb[400010],n,m,i,x,y,c;
long max(long a,long b){
if(a>b)return a;
else return b;
}
void init(long nod,long st,long dr){
long mij;
if(st==dr){
arb[nod]=a[st];
return;
}
mij=(st+dr)/2;
init(2*nod+1,st,mij);
init(2*nod+2,mij+1,dr);
arb[nod]=max(arb[2*nod+1],arb[2*nod+2]);
}
long query(long nod,long st,long dr){
long maxim,mij;
if(x<=st && y>=dr)
return arb[nod];
maxim=-1;
mij=(st+dr)/2;
if(x<=mij)
maxim=max(maxim,query(2*nod+1,st,mij));
if(y>=mij+1)
maxim=max(maxim,query(2*nod+2,mij+1,dr));
return maxim;
}
void update(long nod,long st,long dr){
long mij;
/*if(a[x]>arb[nod])
arb[nod]=a[x];*/
if(st==dr){
arb[nod]=a[x];
return;
}
mij=(st+dr)/2;
if(x<=mij)
update(2*nod+1,st,mij);
if(x>=mij+1)
update(2*nod+2,mij+1,dr);
arb[nod]=max(arb[2*nod+1],arb[2*nod+2]);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(i=0;i<n;i++)
scanf("%ld",&a[i]);
init(0,0,n-1);
for(i=0;i<m;i++){
scanf("%ld%ld%ld",&c,&x,&y);
if(c==0){
x=x-1;y=y-1;
printf("%ld\n",query(0,0,n-1));
}
else{
x=x-1;
a[x]=y;
update(0,0,n-1);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}