#include<stdio.h>
#define dim 400000
FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");
int A[dim],n,m,i,y;
inline int maxim(int a , int b){
return (a>b)?a:b;
}
int querry(int nod, int st,int dr,int a , int b){
//interoghez arborele ce in a[nod] stie informatia pentru intervalul [st,dr] cu intervalul [a,b]
int max=-1000,max1=-1000,mij;
if(a<=st&&dr<=b)
return A[nod];
mij=(st+dr)/2;
if(mij>=a)
max=querry(2*nod,st,mij,a,b);
if((mij+1)<=b)
max1=querry(2*nod+1,mij+1,dr,a,b);
return maxim(max,max1);
}
void update(int nod , int st , int dr , int x){
if(st==dr) {
A[nod] = y;
return;
}
int mij=(st+dr)/2;
if(st<=x&&x<=mij)
update(2*nod,st,mij,x);
if((mij+1)<=x&&x<=dr)
update(2*nod+1,mij+1,dr,x);
A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
int main(){
int a,b,op;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&y);
update(1,1,n,i);
}
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&op,&a,&y);
switch(op){
case 0:
fprintf(g,"%d\n",querry(1,1,n,a,y));
break;
default:
update(1,1,n,a);
break;
}
}
return 0;
}