#include <fstream>
#define NMax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,Max;
int AINT[4*NMax];
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++)
{
int x;
fin>>x;
Update(1,1,N,i,x);
}
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;
}