#include<stdio.h>
#define Nm (1<<17)
#define ls (n<<1)
#define rs (n<<1|1)
#define md (l+r>>1)
#define max(a,b) ((a)>(b)?(a):(b))
int A[Nm],M[Nm<<1];
void build(int n, int l, int r)
{
if(l==r)
{
M[n]=A[l];
return;
}
build(ls,l,md);
build(rs,md+1,r);
M[n]=max(M[ls],M[rs]);
}
int a,b,ans;
void update(int n, int l, int r)
{
if(l==r)
{
M[n]=b;
return;
}
if(a<=md)
update(ls,l,md);
else
update(rs,md+1,r);
M[n]=max(M[ls],M[rs]);
}
void query(int n, int l, int r)
{
if(a<=l && r<=b)
{
ans=max(ans,M[n]);
return;
}
if(a<=md)
query(ls,l,md);
if(b>md)
query(rs,md+1,r);
}
int main()
{
int n,m,i;
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);
while(m--)
{
scanf("%d%d%d",&i,&a,&b);
if(i)
update(1,1,n);
else
{
ans=0;
query(1,1,n);
printf("%d\n",ans);
}
}
return 0;
}