//Problema: http://infoarena.ro/problema/arbint
#include <stdio.h>
//Global data
int N,M;
int ArbInt[4 * 100001 + 10],A,Val,B,Max,Pos;
//Prototypes
void UpdateArbInt(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 = 1; i<=N; ++i)
{
scanf("%d", &Val);
Pos = i;
UpdateArbInt(1,1,N);
}
int _oper, _x, _y;
for(int i=1; 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(Pos<=_mij)
UpdateArbInt(2*Nod, St, _mij);
if(Pos>_mij)
UpdateArbInt(2*Nod+1, _mij+1, Dr);
ArbInt[Nod] = MaxBetween(2*Nod,2*Nod+1);
}
int MaxBetween(int X, int Y)
{
if(X>Y)
return X;
return 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);
}