#include <stdio.h>
const int Lim = 300005;
int N,M,Op,A,B,Val,Pos,Sol;
int Arb[Lim];
void Update(int,int,int);
void Query(int,int,int);
inline int Max(int A,int B)
{
return (A > B) ? A : B;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for (int i = 1;i <= N;i++)
{
scanf("%d",&Val);
Pos = i;
Update(1,1,N);
}
for (int i = 1;i <= M;i++)
{
scanf("%d%d%d",&Op,&A,&B);
if (Op == 0)
{
Sol = 0;
Query(1,1,N);
printf("%d\n",Sol);
}
else
{
Pos = A; Val = B;
Update(1,1,N);
}
}
}
void Update(int Node,int Left,int Right)
{
if (Left == Right)
{
Arb[Node] = Val;
return;
}
int Med = (Left + Right) / 2;
if (Pos <= Med) Update(2*Node,Left,Med);
else Update(2*Node+1,Med+1,Right);
Arb[Node] = Max(Arb[2*Node],Arb[2*Node+1]);
}
void Query(int Node,int Left,int Right)
{
if (A <= Left && Right <= B)
{
Sol = Max(Sol,Arb[Node]);
return;
}
int Med = (Left + Right) / 2;
if (A <= Med) Query(2*Node,Left,Med);
if (Med < B) Query(2*Node+1,Med+1,Right);
}