#include <fstream>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
class maxSegmentTree{
int *data;
int size;
int n;
public:
maxSegmentTree(int x){
n=x;
int log,aux;
//for(aux=1;aux<=n;aux<<=1,log++);
//log--;
log=10;
data=new int[n*log];
for(int i=1;i<n*log;++i){
data[i]=-1;
}
}
private:
int getMax(int l,int r,int a,int b,int poz){
int result=-1;
int m=(l+r)/2;
if(l>=a&&r<=b)
return data[poz];
if(m<b){
result=max(result,getMax(m+1,r,a,b,2*poz+1));
}
if(m>=a){
result=max(result,getMax(l,m,a,b,2*poz));
}
return result;
}
bool updateVal(int l,int r,int poz,int index,int val){
int m=(l+r)/2;
if(l==r && l==index){
data[poz]=val;
return true;
}
if(m>=index){
updateVal(l,m,2*poz,index,val);
}
else{
updateVal(m+1,r,2*poz+1,index,val);
}
data[poz]=max(data[2*poz],data[2*poz+1]);
}
public:
int query(int l,int r){
return getMax(1,n,l,r,1);
}
bool update(int position,int value){
return updateVal(1,n,1,position,value);
}
};
int main(){
int n,m;
maxSegmentTree *st;
in>>n>>m;
st=new maxSegmentTree(n);
int op,a,b;
for(int i=1;i<=n;++i){
in>>a;
st->update(i,a);
}
for(int i=1;i<=m;++i){
in>>op>>a>>b;
if(op==0){
out<<st->query(a,b)<<"\n";
continue;
}
st->update(a,b);
}
return 0;
}