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