#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M,q,a,b,A[100005],arb[400005];
void construct(int nod,int st,int dr){
if(st == dr){
arb[nod] = A[st];
return;
}
int m=(st+dr)/2;
construct(2*nod,st,m);
construct(2*nod+1,m+1,dr);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void actualizare(int nod,int st,int dr,int x,int y){
if(st == dr){
arb[nod] = y;
return;
}
int m = (st+dr)/2;
if(x<=m){
actualizare(2*nod,st,m,x,y);
}
else{
actualizare(2*nod+1,m+1,dr,x,y);
}
arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}
int cautare(int nod,int st,int dr,int a,int b){
if(a<=st && b>=dr){
return arb[nod];
}
int maxs=0,maxd=0;
int m = (st+dr)/2;
if(a<=m){
maxs=cautare(2*nod,st,m,a,b);
}
if(b>m){
maxd=cautare(2*nod+1,m+1,dr,a,b);
}
return max(maxs,maxd);
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++){
fin>>A[i];
}
construct(1,1,N);
for(int i=1;i<=M;i++){
fin>>q>>a>>b;
if(q == 0){
fout<<cautare(1,1,N,a,b)<< '\n';
}
else{
actualizare(1,1,N,a,b);
}
}
fin.close();
fout.close();
return 0;
}