#include <cstdio>
using namespace std;
int a,b,dr,st,x,i,nr,nr1,Max,c[600004],p,n,m;
void update (int nod, int st, int dr)
{
if (st==dr)
{
c[nod]=x;
return;
}
if ((st+dr)/2>=a)
update(nod*2,st,(st+dr)/2);
else
update(nod*2+1,(st+dr)/2+1,dr);
if (c[nod*2]>c[nod*2+1])
c[nod]=c[nod*2];
else
c[nod]=c[nod*2+1];
}
void query (int nod, int st, int dr, int a, int b)
{
if (st>=a && dr<=b)
{
if (Max<c[nod])
Max=c[nod];
}
else
{
if (((st+dr)/2)>=a)
query(nod*2,st,(st+dr)/2,a,b);
if (((st+dr)/2+1)<=b)
query(nod*2+1,(st+dr)/2+1,dr,a,b);
}
}
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", &x);
a=i;
update(1,1,n);
}
for (i=1;i<=m;i++)
{
scanf ("%d %d %d", &p, &a, &b);
if (p==0)
{
Max=0;
query(1,1,n,a,b);
printf ("%d\n", Max);
}
else
{
x=b;
update(1,1,n);
}
}
return 0;
}