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