#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int dim=100009;
struct SegmentTree{
int aint[8*dim];
void update(int nod,int tl,int tr,int poz,int val){
if(tl==tr){
aint[nod]=val;
return;
}
int tm=(tl+tr)/2;
if(poz<=tm){
update(2*nod,tl,tm,poz,val);
}
else{
update(2*nod+1,tm+1,tr,poz,val);
}
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int query(int nod,int tl,int tr,int l,int r){
if(l==tl && r==tr){
return aint[nod];
}
int tm=(tl+tr)/2;
if(r<=tm){
return query(2*nod,tl,tm,l,r);
}
if(l>tm){
return query(2*nod+1,tm+1,tr,l,r);
}
return max(query(2*nod,tl,tm,l,tm),query(2*nod+1,tm+1,tr,tm+1,r));
}
}aint;
signed main(){
int n,q;
fin>>n>>q;
for(int i=1;i<=n;i++){
int x;
fin>>x;
aint.update(1,1,n,i,x);
}
while(q--){
int op;
fin>>op;
if(op==0){
int l,r;
fin>>l>>r;
fout<<aint.query(1,1,n,l,r)<<'\n';
}
else{
int a,b;
fin>>a>>b;
aint.update(1,1,n,a,b);
}
}
}