#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMAX = 1e5 + 5;
int N, A[NMAX], M, Type, X, Y;
int V[4 * NMAX];
inline void Update (int Node, int a, int b, int pos, int val)
{
if(a == b)
{
V[Node] = val;
return;
}
int Mid = (a + b) / 2;
if(pos <= Mid)
Update(2 * Node, a, Mid, pos, val);
if(pos > Mid)
Update(2 * Node + 1, Mid + 1, b, pos, val);
V[Node] = max(V[2 * Node], V[2 * Node + 1]);
return;
}
inline int Query (int Node, int a, int b, int qa, int qb)
{
if(qa <= a && b <= qb)
return V[Node];
int Mid = (a + b) / 2;
int ans1 = -1, ans2 = -1;
if(qa <= Mid)
ans1 = Query(2 * Node, a, Mid, qa, qb);
if(qb > Mid)
ans2 = Query(2 * Node + 1, Mid + 1, b, qa, qb);
return max(ans1, ans2);
}
int main()
{
f.tie(NULL);
f >> N >> M;
for(int i = 1; i <= N; ++i)
{
f >> A[i];
Update(1, 1, N, i, A[i]);
}
for(int i = 1; i <= M; ++i)
{
f >> Type >> X >> Y;
if(Type == 0)
g << Query(1, 1, N, X, Y) << '\n';
else
Update(1, 1, N, X, Y);
}
return 0;
}