#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int Nmax = 100000;
int N,M,maxim;
int Arb[4*Nmax+5];
void Update(int K,int L,int R,int P, int Val){
if(L == R){
Arb[K] = Val;
return;
}
int Mid = (L+R)/2;
if(P <= Mid){
Update(2*K,L,Mid,P,Val);
}else{
Update(2*K+1,Mid+1,R,P,Val);
}
Arb[K] = max(Arb[2*K],Arb[2*K+1]);
}
void Query(int K,int L,int R,int QL, int QR){
if(QL <= L && R <= QR){ //segmentul e inclus in segmentul de query
maxim = max(maxim,Arb[K]);
return;
}
if(R < QL || QR < L) return; //segmentul e inafara segmentului de query
int Mid = (L+R)/2;
Query(2*K,L,Mid,QL,QR);
Query(2*K+1,Mid+1,R,QL,QR);
}
int main()
{
int val;
fin>>N>>M;
for(int i = 1; i <= N; i++){
fin>>val;
Update(1,1,N,i,val);
}
int a,b,task;
for(int i = 1; i <= M; i++){
fin>>task>>a>>b;
if(task){
Update(1,1,N,a,b);
}else{
maxim = 0;
Query(1,1,N,a,b);
fout<<maxim<<'\n';
}
}
return 0;
}