#include <cstdio>
int n,m,v[100006],arbMax[400006],val,poz,valMax,start,finish;
void citire(){
scanf("%d %d",&n,&m);
int i;
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
}
void solve(int a,int b){
int max=-1,i;
for(i=a;i<=b;i++)
if(max<v[i])
max=v[i];
printf("%d\n",max);
}
void rezolvare1(){
int i,x,a,b;
for(i=1;i<=m;i++){
scanf("%d %d %d",&x,&a,&b);
if(x==1)
v[a]=b;
else solve(a,b);
}
}
int maxim(int a,int b){
if(a>b)
return a;
else return b;
}
void update(int nod,int st,int dr){
if(st==dr){
arbMax[nod]=val;
return;
}
int min=(st+dr)/2;
if(poz<=min)
update(2*nod,st,min);
else update(2*nod+1,min,dr);
arbMax[nod]=maxim(arbMax[2*nod],arbMax[2*nod+1]);
}
void query(int nod,int st,int dr){
if(start<=st && dr>=finish){
if(valMax<arbMax[nod])
valMax=arbMax[nod];
return;
}
int min=(st+dr)/2;
if(min>=start)
query(2*nod,st,min);
if(min+1<=finish)
query(2*nod+1,min+1,dr);
}
void rezolvare2(){
int i,x,a,b;
for(i=1;i<=n;i++){
val=v[i];
poz=i;
update(1,1,n);
}
for(i=1;i<=m;i++){
scanf("%d %d %d",&x,&a,&b);
if(x==1){
val=b;
poz=a;
update(1,1,n);
}
else {
start=a;
finish=b;
valMax=-1;
query(1,1,n);
printf("%d\n",valMax);
}
}
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
if(n<=10000 && m<=10000)
rezolvare1();
else rezolvare2();
return 0;
}