#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int N, ArbInt[410010];
inline int Max (int a, int b)
{
if (a>b)
{
return a;
}
return b;
}
void Update (int L, int R, int X, int Y, int K)
{
int M;
M=(L+R)/2;
if (L==R)
{
ArbInt[K]=Y;
return;
}
if (X<=M)
{
Update (L, M, X, Y, 2*K);
}
else
{
Update (M+1, R, X, Y, 2*K+1);
}
ArbInt[K]=Max (ArbInt[2*K], ArbInt[2*K+1]);
}
int Query (int L, int R, int QL, int QR, int K)
{
int M;
M=(L+R)/2;
if (L==QL and R==QR)
{
return ArbInt[K];
}
if (QR<=M)
{
return Query (L, M, QL, QR, 2*K);
}
if (QL>M)
{
return Query (M+1, R, QL, QR, 2*K+1);
}
return Max (Query (L, M, QL, M, 2*K), Query (M+1, R, M+1, QR, 2*K+1));
}
int main ()
{
int M, i, Tip, A, B, X;
fin >> N >> M;
for (i=1; i<=N; ++i)
{
fin >> X;
Update (1, N, i, X, 1);
}
for (; M>0; --M)
{
fin >> Tip >> A >> B;
if (Tip==0)
{
fout << Query (1, N, A, B, 1) << "\n";
}
else
{
Update (1, N, A, B, 1);
}
}
fin.close ();
fout.close ();
return 0;
}