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