#include<stdio.h>
#define nmax 100010
int v[nmax<<1],val[nmax],n,m;
inline int MAX (int a, int b)
{
if(a>b)
return a;
else
return b;
}
void make_a(int x, int y,int p)
{
if(x==y)
{
v[p]=val[x];
return;
}
int mij=(x+y)>>1;
make_a(x,mij,p<<1);
make_a(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,mx=0;
mij=(x+y)>>1;
if(a<=mij)
mx=MAX(mx,query(x,mij,p<<1,a,b));
if(b>=mij+1)
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 val)
{
if(x==y)
{
v[p]=val;
return;
}
int mij;
mij=(x+y)>>1;
if(a<=mij)
update(x,mij,p<<1,a,val);
if(a>=mij+1)
update(mij+1,y,(p<<1)+1,a,val);
v[p]=MAX(v[p<<1],v[ (p<<1)+1]);
}
int main()
{
int i,cod,a,b;
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]);
make_a(1,n,1);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&cod,&a,&b);
if(cod==0)
printf("%d\n",query(1,n,1,a,b));
else
update(1,n,1,a,b);
}
return 0;
}