//Problema: http://infoarena.ro/problema/arbint
#include <stdio.h>
//Global data
int N,M;
int ArbInt[200001],A,Val,B,Max,Pos;
//Prototypes
void UpdateArbInt(int Nod, int St, int Dr);
void QueryArbInt(int Nod, int St, int Dr);
int MaxBetween(int X, int Y);
void MaxFromInterval(int Nod, int St, int Dr);
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d", &N, &M);
for(int i = 0; i<N; i++)
{
scanf("%d", &Val);
Pos = i;
UpdateArbInt(i,1,N);
}
int _oper, _x, _y;
for(int i=0; i<M; ++i)
{
scanf("%d%d%d",&_oper,&_x,&_y);
Max = -1;
if(_oper == 0)
{
A=_x;
B=_y;
MaxFromInterval(1,1,N);
printf("%d\n",Max);
}
else
{
Pos=_x;
Val=_y;
UpdateArbInt(1,1,N);
}
}
return 0;
}
//Functions and routines
void UpdateArbInt(int Nod, int St, int Dr)
{
if(St==Dr)
{
ArbInt[Nod] = Val;
return;
}
int _mij = (St+Dr)/2;
if(_mij<=Pos)
UpdateArbInt(2*Nod, St, _mij);
if(_mij>Pos)
UpdateArbInt(2*Nod+1, _mij+1, Dr);
ArbInt[Nod] = MaxBetween(2*Nod,2*Nod+1);
}
int MaxBetween(int X, int Y)
{
return (X>Y?X:Y);
}
void MaxFromInterval(int Nod,int St,int Dr)
{
if(St>=A && Dr<=B)
{
if(ArbInt[Nod]>Max)
Max = ArbInt[Nod];
return ;
}
int _mij=(St+Dr)/2;
if(A<=_mij)
MaxFromInterval(2*Nod,St,_mij);
if(_mij<B)
MaxFromInterval(2*Nod+1,_mij+1,Dr);
}