#include <iostream>
#define NMax 100005
using namespace std;
int ArbInt[4*NMax], N;
inline int Max (int a, int b)
{
if (a>b)
{
return a;
}
return b;
}
void Update (int K, int L, int R, int X, int V)
{
int Mid=(L+R)/2;
if (L==R)
{
ArbInt[K]=V;
return ;
}
if (X<=Mid)
{
Update (2*K, L, Mid, X, V);
}
else
{
Update (2*K+1, Mid+1, R, X, V);
}
ArbInt[K]=Max (ArbInt[2*K], ArbInt[2*K+1]);
}
int Query (int K, int L, int R, int QL, int QR)
{
int Mid=(L+R)/2;
if (L==QL && R==QR)
{
return ArbInt[K];
}
if (QR<=Mid)
{
return Query (2*K, L, Mid, QL, QR);
}
if (QL>Mid)
{
return Query (2*K+1, Mid+1, R, QL, QR);
}
return Max (Query (2*K, L, Mid, QL, Mid), Query (2*K+1, Mid+1, R, Mid+1, QR));
}
int main()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int M;
scanf ("%d %d", &N, &M);
for (int i=1; i<=N; ++i)
{
int X;
scanf ("%d", &X);
Update (1, 1, N, i, X);
}
for (; M>0; --M)
{
int Tip, X, Y;
scanf ("%d %d %d", &Tip, &X, &Y);
if (Tip==0)
{
printf ("%d\n", Query (1, 1, N, X, Y));
}
else
{
Update (1, 1, N, X, Y);
}
}
return 0;
}