#include <cstdio>
#define maxn 100001
FILE *f = fopen("arbint.in","r");
FILE *g = fopen("arbint.out","w");
int arb[4*maxn],m,n,a[maxn],maxi;
inline int maxim(int a,int b){
return a>b?a:b;
}
void insert(int nod,int poz,int cap_st,int cap_dr,int val){
if(cap_st==cap_dr){
arb[nod] = val;
return;
}
int mij = (cap_st+cap_dr)/2;
if(poz<=mij)
insert(2*nod,poz,cap_st,mij,val);
else
insert(2*nod+1,poz,mij+1,cap_dr,val);
arb[nod] = maxim(arb[2*nod],arb[2*nod+1]);
}
int query(int nod,int cap_st,int cap_dr,int A,int b){
if(cap_st>=A && b>=cap_dr){
if(arb[nod]>maxi)
maxi = arb[nod];
return maxi;
}
int mij = (cap_st+cap_dr)/2;
if(A<=mij)
return query(2*nod,cap_st,mij,A,b);
if(b>mij)
return query(2*nod+1,mij+1,cap_dr,A,b);
}
void solve(){
fscanf(f,"%d%d",&n,&m);
int i,x,A,b;
for(i=1;i<=n;i++){
fscanf(f,"%d",&a[i]);
insert(1,i,1,n,a[i]);
}
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&x,&A,&b);
if(x==1){
a[A]=b;
insert(1,A,1,n,b);
}
else{
maxi = -1;
fprintf(g,"%d\n",query(1,1,n,A,b));
}
}
}
int main(){
solve();
fclose(f);
fclose(g);
return 0;
}