#include<cstdio>
int n,m,op,a,b,v[1000010],i,j;
FILE *f,*g;
int maxim(int a,int b){
if(a>b)
return a;
return b;
}
void ad(int nod,int a,int b,int st,int dr){
if(st==dr&&st==a){
v[nod]=b;
return;
}
int mid=(st+dr)/2;
if(a<=mid)
ad(2*nod,a,b,st,mid);
if(a>mid)
ad(2*nod+1,a,b,mid+1,dr);
v[nod]=maxim(v[2*nod],v[2*nod+1]);
}
int query(int nod,int st,int dr){
int qs=-2000000000,qd=-2000000000,mid;
if(a<=st&&dr<=b)
return v[nod];
mid=(st+dr)/2;
if(a<=mid)
qs=query(2*nod,st,mid);
if(mid<b)
qd=query(2*nod+1,mid+1,dr);
return maxim(qs,qd);
}
int main(){
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%d%d",&n,&m);
/* for(i=1;i<=2*n;i++){
v[i]=-2000000000;
}*/
for(i=1;i<=n;i++){
fscanf(f,"%d",&a);
ad(1,i,a,1,n);
}
for(i=1;i<=n;i++){
fscanf(f,"%d%d%d",&op,&a,&b);
if(op==1){
ad(1,a,b,1,n);
}
else{
fprintf(g,"%d\n",query(1,1,n));
}
}
fclose(f);
fclose(g);
return 0;
}