#include<stdio.h>
FILE *f,*g;
long i,n,m,x,y,op,arb[500500];
long maxim(long a,long b)
{ if(a>b) return a; return b; }
inline void update(long k,long st,long dr,long poz,long val)
{ if(st==dr&&dr==poz) arb[k]=val;
else
{ long mij=(st+dr)/2;
if(poz<=mij) { update(2*k,st,mij,poz,val); arb[k]=maxim(arb[2*k],arb[2*k+1]); }
else { update(2*k+1,mij+1,dr,poz,val); arb[k]=maxim(arb[2*k],arb[2*k+1]); }
}
}
inline long querry(long k,long st,long dr,long x,long y)
{ if(x<=st&&dr<=y) return arb[k];
else
{ long mij=(st+dr)/2; long fs,fd;
if(x<=mij) fs=querry(2*k,st,mij,x,y); else fs=0;
if(y>=mij+1) fd=querry(2*k+1,mij+1,dr,x,y); else fd=0;
return maxim(fs,fd);
}
}
int main()
{ f=fopen("arbint.in","r"); g=fopen("arbint.out","w");
fscanf(f,"%ld%ld",&n,&m);
for(i=1;i<=n;i++) { fscanf(f,"%ld",&x); update(1,1,n,i,x); }
for(i=1;i<=m;i++)
{ fscanf(f,"%ld%ld%ld",&op,&x,&y);
if(op==0) fprintf(g,"%ld\n",querry(1,1,n,x,y));
else update(1,1,n,x,y);
}
fclose(g);
return 0;
}