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