#include<iostream>
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int mx=1e5+100;
int n,m,val[mx],tree[4*mx];
void read(){
in>>n>>m;
for(int i=0;i<n;i++)
in>>val[i];
}
void build_tree(int index,int l,int r){
if(l==r){
tree[index]=val[l];
}
else{
int mid=(l+r)/2;
build_tree(index*2,l,mid);
build_tree(index*2+1,mid+1,r);
tree[index]=max(tree[index*2],tree[index*2+1]);
}
}
void update(int index,int l,int r,int x,int value){
if(l==r){
tree[index]=value;
}
else{
int mid=(l+r)/2;
if(x<=mid){
update(index*2,l,mid,x,value);
}
else{
update(index*2+1,mid+1,r,x,value);
}
tree[index]=max(tree[index*2],tree[index*2+1]);
}
}
void update(int index,int value){
update(1,0,n-1,index,value);
}
int query(int index,int l,int r,int a,int b){
if(l>=a && r<=b){
return tree[index];
}
else{
int mid=(l+r)/2,result=-1;
if(a<=mid){
result=max(result,query(index*2,l,mid,a,b));
}
if(b>mid){
result=max(result,query(index*2+1,mid+1,r,a,b));
}
return result;
}
}
int query(int l,int r){
return query(1,0,n-1,l,r);
}
void solve(){
build_tree(1,0,n-1);
int x,a,b;
for(int i=0;i<m;i++){
in>>x>>a>>b;
if(x==0){
out<<query(a-1,b-1)<<'\n';
}
else{
update(a-1,b);
}
}
}
int main(){
read();
solve();
return 0;
}