#include <fstream>
#define DIM 100001
using namespace std;
int n,m,x,arb[2*DIM],a,b;
bool t;
void Update(int k,int poz,int x,int st,int dr){
//nodul k-intervalul [st,dr]
//inlocuiesc valoarea de pe pozitia poz cu valoarea x
int mid=(st+dr)/2;
if(st==dr) arb[k]=x;
else{
if(poz<=mid) Update(k*2,poz,x,st,mid);
else Update(k*2+1,poz,x,mid+1,dr);
arb[k]=max(arb[k*2],arb[k*2+1]);
}
}
int Queri(int k,int a,int b,int st,int dr){
if(a<=st && b>=dr) return arb[k];
else{
int mid=(st+dr)/2;
if(b<=mid) return Queri(k*2,a,b,st,mid);
else if(a>mid) return Queri(k*2+1,a,b,mid+1,dr);
else return max(Queri(k*2,a,mid,st,mid),Queri(k*2+1,mid+1,b,mid+1,dr));
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for(int i=1;i<=n;++i){
f>>x;
Update(1,i,x,1,n);
}
for(int i=1;i<=m;++i){
f>>t>>a>>b;
if(t) Update(1,a,b,1,n);
else g<<Queri(1,a,b,1,n)<<'\n';
}
f.close();
g.close();
return 0;
}