#include <fstream>
using namespace std;
#define NMax 100005
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M;
int AINT[4*NMax],Max,X[NMax];
void Build(int Nod, int Left, int Right)
{
if(Left==Right)
{
AINT[Nod]=X[Left];
}
else
{
int Mid=(Left+Right)/2;
Build(2*Nod,Left,Mid);
Build(2*Nod+1,Mid+1,Right);
AINT[Nod]=max(AINT[2*Nod],AINT[2*Nod+1]);
}
}
void Update(int Nod, int Left, int Right, int P, int V)
{
if(Left==Right)
{
AINT[Nod]=V;
}
else
{
int Mid=(Left+Right)/2;
if(P<=Mid)
Update(2*Nod,Left,Mid,P,V);
else
Update(2*Nod+1,Mid+1,Right,P,V);
AINT[Nod]=max(AINT[2*Nod],AINT[2*Nod+1]);
}
}
void Query(int Nod, int Left, int Right, int QLeft, int QRight)
{
if (QLeft<=Left && Right<=QRight)
{
Max=max(Max,AINT[Nod]);
}
else
{
int Mid=(Left+Right)/2;
if(QLeft <= Mid)
Query(2*Nod,Left,Mid,QLeft,QRight);
if(QRight > Mid)
Query(2*Nod+1,Mid+1,Right,QLeft,QRight);
}
}
int main()
{
fin>>N>>M;
for ( int i = 1; i <= N; i++ )
{
fin>>X[i];
}
Build(1,1,N);
for ( int i = 1; i <= M; i++ )
{
int X,A,B;
fin>>X>>A>>B;
if ( X == 0 )
{
Max=-1;
Query(1,1,N,A,B);
fout<<Max<<'\n';
}
else
{
Update(1,1,N,A,B);
}
}
}