#include<cstdio>
const int nmax=1e5+5;
int n,q,v[nmax],arb[4*nmax+66];
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
inline void buildtree(int node,int st,int dr)
{
if(st==dr)
{
arb[node]=v[st];
return;
}
int med=(st+dr)>>1;
buildtree(2*node,st,med);
buildtree(2*node+1,med+1,dr);
arb[node]=max(arb[2*node],arb[2*node+1]);
}
inline int query(int node,int st,int dr,int l,int r)
{
if(l<=st&&dr<=r)
return arb[node];
if(l>dr||r<st)
return 0;
int med=(st+dr)/2;
return max(query(2*node,st,med,l,r),query(2*node+1,med+1,dr,l,r));
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i;
scanf("%d%d",&n,&q);
for(i=1;i<=n;++i)
scanf("%d",&v[i]);
buildtree(1,1,n);
int op,a,b;
for(i=1;i<=q;++i)
{
scanf("%d%d%d",&op,&a,&b);
if(op)
{
v[a]=b;
buildtree(1,1,n);
}
else
printf("%d\n",query(1,1,n,a,b));
}
}