#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,Max;
int X[NMax],AINT[4*NMax];
void Build(int Nod, int Left, int Right)
{
if(Left == Right)
{
AINT[Nod] = X[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]);
}
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 Query(int Nod, int Left, int Right, int Start, int Finish)
{
if(Start<=Left && Right<=Finish)
{
Max = max(Max, AINT[Nod]);
return;
}
int Mid = (Left+Right)/2;
if(Start <= Mid)
Query(2*Nod,Left,Mid,Start,Finish);
if(Mid+1 <= Finish)
Query(2*Nod+1,Mid+1,Right,Start,Finish);
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
{
fin>>X[i];
}
Build(1,1,N);
while(M--)
{
int op,x,y;
fin>>op>>x>>y;
if(op==0)
{
Max = 0;
Query(1,1,N,x,y);
fout<<Max<<"\n";
}
if(op==1)
Update(1,1,N,x,y);
}
return 0;
}