#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 Pos, int V)
{
int Mid=(L+R)/2;
if (L==R)
{
ArbInt[K]=V;
return;
}
if (Pos<=Mid)
{
Update (2*K, L, Mid, Pos, V);
}
else
{
Update (2*K+1, Mid+1, R, Pos, 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 and 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 Type, X, Y;
scanf ("%d %d %d", &Type, &X, &Y);
if (Type==0)
{
printf ("%d\n", Query (1, 1, N, X, Y));
}
else
{
Update (1, 1, N, X, Y);
}
}
return 0;
}