#include<stdio.h>
#define nmax 100005
int x[3*nmax],v[nmax],n,m;
FILE *f;
void cit(){
fscanf(f,"%d%d",&n,&m);
for(int i=1;i<=n;i++)
fscanf(f,"%d",&v[i]);
}
void init(int k,int st,int dr){
int m;
if(st==dr)
x[k]=v[st];
else{
m=(st+dr)/2;
init(2*k,st,m);
init(2*k+1,m+1,dr);
if(x[2*k]>x[2*k+1])
x[k]=x[2*k];
else
x[k]=x[2*k+1];
}
}
int query(int k,int st,int dr,int a,int b){
if(a<=st&&dr<=b)
return x[k];
else{
int m,val,max=0;
m=(st+dr)/2;
if(a<=m){
val=query(2*k,st,m,a,b);
if(val>max)
max=val;
}
if(b>=m+1){
val=query(2*k+1,m+1,dr,a,b);
if(val>max)
max=val;
}
return max;
}
}
void update(int k,int st,int dr,int a,int b){
if(st==dr)
x[k]=b;
else{
int m;
m=(st+dr)/2;
if(a<=m){
update(2*k,st,m,a,b);
if(x[2*k]<x[2*k+1])
x[k]=x[2*k+1];
else
x[k]=x[2*k];
}else{
update(2*k+1,m+1,dr,a,b);
if(x[2*k]<x[2*k+1])
x[k]=x[2*k+1];
else
x[k]=x[2*k];
}
}
}
int main(){
FILE *g;
int a,b,c;
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
cit();
init(1,1,n);
for(int i=1;i<=m;i++){
fscanf(f,"%d%d%d",&c,&a,&b);
if(c==0)
fprintf(g,"%d\n",query(1,1,n,a,b));
else
update(1,1,n,a,b);
}
fclose(f);
fclose(g);
return 0;
}