#include<stdio.h>
int m,n,i,j,v[100013],h[200013],c,x,y;
inline int max(int a, int b)
{
return(a>b?a:b);
}
int constr(int i, int st, int dr)
{
if(st==dr) {h[i]=v[st];return v[st]; }
h[i]=max(constr(i*2,st,(st+dr)/2),constr(i*2+1,(st+dr)/2+1,dr));
return h[i];
}
int gas(int i, int st, int dr, int x, int y)
{
if(st==x && dr==y)return h[i];
int m=(st+dr)/2;
if(y<=m) return gas(i*2,st,m,x,y);
if(x>=m+1) return gas(i*2+1,m+1,dr,x,y);
return max(gas(i*2,st,m,x,m),gas(i*2+1,m+1,dr,m+1,y));
}
int upd(int i, int st, int dr, int x)
{
if(st==x && dr==x){v[st]=h[i]=y;return y;}
int m=(st+dr)/2;
if(x<=m) h[i]=max(upd(i*2,st,m,x),h[i*2+1]);
else h[i]=max(h[i*2],upd(i*2+1,m+1,dr,x));
return h[i];
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)scanf("%d",&v[i]);
h[1]=constr(1,1,n);
for(i=0;i<m;++i)
{
scanf("%d%d%d",&c,&x,&y);
switch(c)
{
case 0:
{
printf("%d\n",gas(1,1,n,x,y));
break;
}
case 1:
{
h[1]=upd(1,1,n,x);
break;
}
}
}
return 0;
}