#include<stdio.h>
#include<algorithm>
using namespace std;
int sol,A[400044],mij,n,m,i,t,a,b;
void update(int nod,int p,int u){
int mij;
if(p == u){
A[nod] = b;
return ;
}
mij=(p+u)>>1;
if(a<=mij)
update(nod<<1,p,mij);
else
update((nod<<1)+1,mij+1,u);
A[nod] = max(A[nod<<1],A[(nod<<1)+1]);
}
void query(int nod,int p,int u){
int mij;
if(a<=p && u<=b){
sol = max(sol, A[nod]);
return;
}
mij=(p+u)>>1;
if(a<= mij) query(nod<<1,p,mij);
if(b > mij) query((nod<<1)+1,mij+1,u);
}
int main(){
FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&b);
a=i;
update(1,0,n);
}
for(i=1;i<=m;i++){
fscanf(f,"%d %d %d",&t,&a,&b);
if(!t){
sol=0;
query(1,0,n);
fprintf(g,"%d\n",sol);
}
else{
update(1,0,n);
}
}
fclose(f);
fclose(g);
return 0;
}