#include<stdio.h>
#define nmax 100005
int v[2*nmax],val[nmax];
inline int MAX(int a, int b)
{
if (a>=b)
return a;
return b;
}
void build(int x,int y, int p)
{
if(x==y)
{
v[p]=val[x];
return;
}
int mij=(x+y)>>1;
build(1,mij,p<<1);
build(mij+1,y,(p<<1)+1);
v[p]=MAX(v[p<<1],v[(p<<1)+1]);
}
int query( int x, int y, int p, int a, int b)
{
if(a<=x && y<=b)
{
return v[p];
}
int mij=(x+y)>>1,mx=9999;
if(a<=mij) mx=MAX(mx,query(x,mij,p<<1,a,b));
if(b<=mij) mx=MAX(mx,query(mij+1,y,(p<<1)+1,a,b));
return mx;
}
void update(int x, int y, int p, int a, int b)
{
if(x==y)
{
v[p]==b;
return;
}
int mij=(x+y)>>1;
if(a<=mij) update(x,mij,p<<1,a,b);
if(mij+1<=a) update(mij+1,y,(p<<1)+1,a,b);
v[p]=MAX(v[p<<1],v[(p<<1)+1]);
}
int main()
{
int i, j,n,m,a,b,k;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
build(1,n,1);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&k,&a,&b);
if(k==0)
printf("%d\n",query(1,n,1,a,b));
else
update(1,n,1,a,b);
}
return 0;
}