#include<stdio.h>
int n,m,v[4000102],poz,val,st,sf;
inline int max(int a,int b)
{
return a>=b?a:b;
}
inline void update(int l,int r,int x)
{
if(l==r)
{
v[x]=val;
return;
}
int med=(l+r)/2;
if(poz<=med)
update(l,med,2*x);
else
update(med+1,r,2*x+1);
v[x]=max(v[2*x],v[2*x+1]);
}
inline void query(int l,int r,int x)
{
if(st<=l && r<=sf)
{
val=max(val,v[x]);
return;
}
int med=(l+r)/2;
if(st<=med)
query(l,med,2*x);
if(med<sf)
query(med+1,r,2*x+1);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i,x,t,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
{
scanf("%d",&x);
poz=i;
val=x;
update(1,n,1);
}
while(m--)
{
scanf("%d%d%d",&t,&a,&b);
if(t==0)
{
st=a;sf=b;
val=0;
query(1,n,1);
printf("%d\n",val);
}
else
{
poz=a;
val=b;
update(1,n,1);
}
}
return 0;
}