#include <cstdio>
#include <algorithm>
using namespace std;
int Arb[300010],a[100010],x,y,n,m,i,cod;
void build(int nod,int st,int dr)
{
if(st==dr)
{
Arb[nod]=a[st];
return;
}
int m=(st+dr)/2,fiu_st=2*nod,fiu_dr=fiu_st+1;
build(fiu_st,st,m);
build(fiu_dr,m+1,dr);
Arb[nod]=max(Arb[fiu_st],Arb[fiu_dr]);
}
void update(int nod,int st,int dr)
{
if(st==dr)
{
Arb[nod]=y;
return;
}
int m=(st+dr)/2,fiu_st=2*nod,fiu_dr=fiu_st+1;
if(x<=m)
update(fiu_st,st,m);
else
update(fiu_dr,m+1,dr);
Arb[nod]=max(Arb[fiu_st],Arb[fiu_dr]);
}
int query(int nod,int st,int dr)
{
if(st>=x&&dr<=y)
return Arb[nod];
int m=(st+dr)/2,fiu_st=2*nod,fiu_dr=fiu_st+1,vs=0,vd=0;
if(x<=m)vs=query(fiu_st,st,m);
if(y>m)vd=query(fiu_dr,m+1,dr);
return max(vs,vd);
}
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",&a[i]);
build(1,1,n);
for(;m;m--)
{
scanf("%d%d%d",&cod,&x,&y);
if(cod==0)
printf("%d\n",query(1,1,n));
else
update(1,1,n);
}
return 0;
}