#include<bits/stdc++.h>
#define ll long long
#define sz size
#define pb push_back
#define er erase
#define in insert
#define fr first
#define sc second
#define mp make_pair
#define pi pair
#define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
#define rc(s) return cout<<s,0
using namespace std;
int m,n,a[100005],tree[400005],t,x,y,rip;
void createtree(int low,int high,int pos){
if(low==high){
tree[pos]=a[low];
return ;
}
int mid=low+(high-low)/2;
createtree(low,mid,2*pos+1);
createtree(mid+1,high,2*pos+2);
tree[pos]=max(tree[2*pos+1],tree[2*pos+2]);
}
void update(int x,int y,int low,int high,int pos){
if(low==high){
tree[pos]=y;
return ;
}
int mid=low+(high-low)/2;
if(x<=mid){
update(x,y,low,mid,2*pos+1);
}
else{
update(x,y,mid+1,high,2*pos+2);
}
tree[pos]=max(tree[2*pos+1],tree[2*pos+2]);
}
int rangemax(int low,int high,int low1,int high1,int pos){
if(low>high1 || low1>high){
return rip;
}
if(low1>=low && high1<=high ){
return tree[pos];
}
int mid=low1+(high1-low1)/2;
return max(rangemax(low,high,low1,mid,2*pos+1),rangemax(low,high,mid+1,high1,2*pos+2));
}
signed main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> a[i];
createtree(1,n,0);
while(m--){
cin >> t >> x >> y;
if(t==0){
cout<<rangemax(x,y,1,n,0)<<endl;
}
else{
update(x,y,1,n,0);
}
}
}