#include <fstream>
using namespace std;
int v[1000005];
int n,q,i,a,b,val,op;
void update(int nod, int st, int dr, int poz, int val) {
if(st==dr && st==poz) {
v[nod]=val;
return;
}
int mid=(st+dr)/2;
if(poz<=mid)
update(nod*2,st,mid,poz,val);
if(poz>mid)
update(nod*2+1,mid+1,dr,poz,val);
v[nod]=max(v[nod*2],v[nod*2+1]);
}
int query(int nod, int st, int dr) {
int qs=0,qd=0;
if(st>=a && dr<=b)
return v[nod];
int mid=(st+dr)/2;
if(a<=mid)
qs=query(2*nod,st,mid);
if(b>mid)
qd=query(2*nod+1,mid+1,dr);
return max(qs,qd);
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>q;
// for(i=1;i<=2*n;i++)
// v[i]=-2000000000;
for(i=1;i<=n;i++) {
f>>val;
update(1,1,n,i,val);
}
for(i=1;i<=q;i++) {
f>>op>>a>>b;
if(op==0) {
g<<query(1,1,n)<<"\n";
}
else
update(1,1,n,a,b);
}
return 0;
}