#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMax = 100000;
int AINT[4 * NMax + 5],V[NMax+5];
int N,M,Max;
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,AINT[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 Val)
{
if(Left == Right)
{
AINT[Nod] = Val;
return;
}
int Mid = (Left + Right) / 2;
if(Pos <= Mid)
Update(2*Nod,Left,Mid,Pos,Val);
else
Update(2*Nod+1,Mid+1,Right,Pos,Val);
AINT[Nod] = max(AINT[2 * Nod],AINT[2 * Nod + 1]);
}
void Build(int Nod, int Left, int Right)
{
if(Left == Right)
{
AINT[Nod] = V[Left];
return;
}
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]);
}
int main()
{
fin>>N>>M;
for(int i = 1; i <= N; ++i)
{
fin >> V[i];
}
Build(1,1,N);
while(M--)
{
int op,a,b;
fin >> op >> a >> b;
if(op == 0)
{
Max = 0;
Query(1,1,N,a,b);
fout << Max << "\n";
}
if(op == 1)
Update(1,1,N,a,b);
}
return 0;
}