#include <fstream>
using namespace std;
ifstream f("arbint.in"); ofstream g("arbint.out");
int AI[1<<19];
void update(int nod, int st, int dr, int a, int b)
{ if(st==dr) {AI[nod]=b; return;}
int mid=(st+dr)>>1;
if(a<=mid) update(2*nod,st,mid,a,b); else update(2*nod+1,mid+1,dr,a,b);
AI[nod]=max(AI[2*nod],AI[2*nod+1]);
}
int query(int nod, int st, int dr,int a, int b)
{ if(a<=st && dr<=b) return AI[nod];
int mid=(st+dr)>>1,max1=0,max2=0;
if(a<=mid) max1=query(2*nod,st,mid,a,b);
if(mid<b) max2=query(2*nod+1,mid+1,dr,a,b);
return max(max1,max2);
}
int main()
{ int n,m;
f>>n>>m;
for(int val,i=1;i<=n;++i) {f>>val; update(1,1,n,i,val);}
for(int op,a,b,i=0;i<m;i++)
{ f>>op>>a>>b;
if(op==0) g<<query(1,1,n,a,b); else update(1,1,n,a,b);
}
g.close(); return 0;
}