#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMax=100005;
int A[4*NMax+5], V[NMax];
int N,M,Max;
void Read()
{
fin>>N>>M;
for(int i=1;i<=N;++i)
{
fin>>V[i];
}
}
void Build(int Nod, int Left, int Right)
{
if(Left==Right)
{
A[Nod]=V[Left];
return;
}
int Mid=(Left+Right)/2;
Build(2*Nod,Left,Mid);
Build(2*Nod+1,Mid+1,Right);
A[Nod]=max(A[Nod*2],A[Nod*2+1]);
}
void Query(int Nod, int Left, int Right,int QLeft, int QRight)
{
if(Right<QLeft || Left>QRight)
return;
if(Left>=QLeft && Right<=QRight)
{
Max=max(Max,A[Nod]);
return;
}
int Mid=(Left+Right)/2;
Query(2*Nod,Left,Mid,QLeft,QRight);
Query(2*Nod+1,Mid+1,Right,QLeft,QRight);
}
void Update(int Nod, int Left, int Right, int Pos, int v)
{
if(Right==Left)
{
A[Nod]=v;
return;
}
int Mid = (Left + Right) / 2;
if(Pos <= Mid)
{
Update(2*Nod,Left,Mid,Pos,v);
}
else
{
Update(2*Nod+1,Mid+1,Right,Pos,v);
}
A[Nod]=max(A[2*Nod],A[2*Nod+1]);
}
int main()
{
Read();
Build(1,1,N);
for(int i=1;i<=M;++i)
{
int p,a,b;
fin>>p>>a>>b;
if(p==0)
{
Max=0;
Query(1,1,N,a,b);
fout<<Max<<"\n";
}
else
{
Update(1,1,N,a,b);
}
}
return 0;
}