#include<fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,A[2000000],V[100003];
void Update(int Nod,int L,int R,int P,int Val){
if(L==R){
A[Nod]=Val;
return;
}
int Mid=(L+R)/2;
int LSon=2*Nod,RSon=2*Nod+1;
if(P<=Mid)
Update(LSon,L,Mid,P,Val);
else
Update(RSon,Mid+1,R,P,Val);
A[Nod]=max(A[LSon],A[RSon]);
}
int Query(int Nod,int L,int R,int QL,int QR){
if(QL<=L && QR>=R){
return A[Nod];
}
int Ans=-20,Mid=(L+R)/2;
int LSon=2*Nod,RSon=2*Nod+1;
if(QL<=Mid)
Ans=max(Ans,Query(LSon,L,Mid,QL,QR));
if(QR>Mid)
Ans=max(Ans,Query(RSon,Mid+1,R,QL,QR));
return Ans;
}
void Build(int Nod,int L,int R){
if(L==R){
A[Nod]=V[L];
return;
}
int Mid=(L+R)/2;
int LSon=2*Nod,RSon=2*Nod+1;
Build(LSon,L,Mid);
Build(RSon,Mid+1,R);
A[Nod]=max(A[LSon],A[RSon]);
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
fin>>V[i];
Build(1,1,N);
for(int i=1;i<=M;i++){
int X,Y,Z;
fin>>X>>Y>>Z;
if(X==0)
fout<<Query(1,1,N,Y,Z)<<'\n';
else
Update(1,1,N,Y,Z);
}
return 0;
}