#include <fstream>
using namespace std;
ifstream is ("arbint.in");
ofstream os ("arbint.out");
int N, M, best;
int arb[400004];
void Update(int N, int L, int R, int pos, int val);
void Query(int N, int L, int R, int iL, int iR);
int main()
{
is >> N >> M;
for (int i = 1, val; i <= N; ++i)
{
is >> val;
Update(1, 1, N, i, val);
}
for (int i = 1, Op, x, y; i <= M; ++i)
{
is >> Op >> x >> y;
if (Op == 0)
{
best = -1;
Query(1, 1, N, x, y);
os << best << '\n';
}
else
Update(1, 1, N, x, y);
}
is.close();
os.close();
}
void Query(int N, int L, int R, int iL, int iR)
{
if (iL <= L && R <= iR)
best = max(best, arb[N]);
else
{
int M = (L+R)/2;
if (iL <= M) Query(2*N, L, M, iL, iR);
if (M < iR) Query(2*N+1, M+1, R, iL, iR);
}
};
void Update(int N, int L, int R, int pos, int val)
{
if (L == R)
arb[N] = val;
else
{
int M = (L+R)/2;
if (pos <= M) Update(2*N, L, M, pos, val);
else Update(2*N+1, M+1, R, pos, val);
arb[N] = max(arb[2*N], arb[2*N+1]);
}
};