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