#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define Nmax 100010
#define LeftSon (Node << 1)
#define RightSon ((Node << 1) + 1)
int Aint[4 * Nmax], Pos, Val, N, M, X, Y, Type;
void Update(int Node, int Left, int Right)
{
if(Left == Right)
{
Aint[Node] = Val;
return ;
}
int Mid = (Left + Right) / 2;
if(Pos <= Mid) Update(LeftSon, Left, Mid);
else Update(RightSon, Mid + 1, Right);
Aint[Node] = max(Aint[LeftSon], Aint[RightSon]);
}
int Query(int Node, int Left, int Right)
{
if(X <= Left && Right <= Y) return Aint[Node];
int Mid = (Left + Right) / 2, Ans = 0;
if(X <= Mid) Ans = max(Ans, Query(LeftSon, Left, Mid));
if(Mid < Y) Ans = max(Ans, Query(RightSon, Mid + 1, Right));
return Ans;
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int i;
scanf("%i %i", &N, &M);
for(i = 1; i <= N; ++i)
{
scanf("%i", &X);
Pos = i, Val = X;
Update(1, 1, N);
}
for(i = 1; i <= M; ++i)
{
scanf("%i %i %i", &Type, &X, &Y);
if(Type == 0) printf("%i\n", Query(1, 1, N));
else
{
Pos = X;
Val = Y;
Update(1, 1, N);
}
}
return 0;
}