#include <stdio.h>
#define Nmax 100002
int Arbi[Nmax*4+50];
int n,i,x,y,op,max,m;
inline int Max(int x,int y){
return x>y ? x : y;
}
void Update(int nod, int l, int r,int poz, int x){
int m;
if( l == r ){
Arbi[nod]=x;
return;
}
m=l+(r-l)/2;
if( poz <= m ) Update(nod*2,l,m,poz,x);
else Update(nod*2+1,m+1,r,poz,x);
Arbi[nod]=Max(Arbi[2*nod],Arbi[2*nod+1]);
}
void Query(int nod, int l, int r, int x,int y){
int m;
if( x<=l && r<=y ){
if(Arbi[nod] > max) max=Arbi[nod];
return;
}
m=l+(r-l)/2;
if(x <= m) Query(2*nod,l,m,x,y);
if(m < y ) Query(2*nod+1,m+1,r,x,y);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d",&x);
Update(1,1,n,i,x);
}
for(i=1;i<=m;++i){
scanf("%d%d%d",&op,&x,&y);
if(op)
Update(1,1,n,x,y);
else{
max=-1;
Query(1,1,n,x,y);
printf("%d\n",max);
}
}
fclose(stdin); fclose(stdout);
return 0;
}