#include <fstream>
#include <vector>
#include <algorithm>
std::vector<unsigned> tree;
void update(unsigned pos, unsigned val, unsigned nod, unsigned st, unsigned dr){
if(st==dr) tree[nod]=val;
else{
unsigned mij=(st+dr)/2;
if(pos<=mij) update(pos,val,nod<<1,st,mij);
else update(pos,val,(nod<<1)+1,mij+1,dr);
tree[nod]=std::max(tree[nod<<1],tree[(nod<<1)+1]);
}
}
unsigned query(unsigned a, unsigned b, unsigned nod, unsigned st, unsigned dr){
if(a<=st&&dr<=b) return tree[nod];
else{
unsigned maxim=0;
unsigned mij=(st+dr)/2;
if(a<=mij) maxim=std::max(maxim,query(a,b,nod<<1,st,mij));
if(b>mij) maxim=std::max(maxim,query(a,b,(nod<<1)+1,mij+1,dr));
return maxim;
}
}
int main(){
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
unsigned n,m; fin>>n>>m;
tree.resize((n<<2)+1,0);
for(unsigned i=1;i<=n;++i){
unsigned x; fin>>x;
update(i,x,1,1,n);
}
for(unsigned i=0;i<m;++i){
char x; unsigned a,b; fin>>x>>a>>b;
if(x=='0') fout<<query(a,b,1,1,n)<<'\n';
else update(a,b,1,1,n);
}
}