#include<cstdio>
#define _NMAX 100010
int nA, vA[_NMAX];
int i_tree[_NMAX*3];
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int create_tree(int iNod,int i,int j)
{
if (i==j) return i_tree[iNod]=vA[i];
else return i_tree[iNod]=max(create_tree(iNod*2,i,(i+j)/2),
create_tree(iNod*2+1,(i+j)/2+1,j));
}
int update_tree(int iNod,int i,int j, int iAs)
{
if (i==j) return i_tree[iNod]=vA[i];
else if (iAs<=(i+j)/2)
return i_tree[iNod]=max(update_tree(iNod*2,i,(i+j)/2,iAs),i_tree[2*iNod+1]);
else
return i_tree[iNod]=max(i_tree[2*iNod],update_tree(iNod*2+1,(i+j)/2+1,j,iAs));
}
int maxquery_tree(int iNod, int i, int j, int segm_beg, int segm_end)
{
if (segm_beg>j||segm_end<i) return 0;
if (segm_beg<=i && segm_end>=j) return i_tree[iNod];
return max(maxquery_tree(iNod*2,i,(i+j)/2,segm_beg,segm_end),
maxquery_tree(iNod*2+1,(i+j)/2+1,j,segm_beg,segm_end));
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int nOperatii;
scanf("%d %d",&nA, &nOperatii);
for (int i=1;i<=nA;i++)
scanf("%d",&vA[i]);
create_tree(1, 1, nA);
for (int i=1;i<=nOperatii;i++)
{
int atrib;
scanf("%d",&atrib);
if (atrib)
{
int iAs, valAs;
scanf("%d %d",&iAs, &valAs);
vA[iAs]=valAs;
update_tree(1,1,nA,iAs);
}
else
{
int seg_b, seg_e;
scanf("%d %d",&seg_b, &seg_e);
printf("%d\n", maxquery_tree(1,1,nA,seg_b,seg_e));
}
}
return 0;
}