#include <bits/stdc++.h>
using ll=long long;
#define S second
#define F first
#define endl '\n'
#define spid ios_base::sync_with_stdio(false);cin.tie(NULL);
const int mod=1e9+7;
const double pi=3.14159265359;
const int maxn=100001;
using namespace std;
int q,n,A[maxn],tree[4*maxn];
void build(int l,int r,int i){
if(l==r){
tree[i]=A[l];
return;
}
int mid=(l+r)/2;
build(l,mid,2*i+1);
build(mid+1,r,2*i+2);
tree[i]=max(tree[2*i+1],tree[2*i+2]);
}
int que(int ql,int qr,int l,int r,int i){
if(ql<=l&&qr>=r)return tree[i];
int left=0;
int right=0;
int mid=(l+r)/2;
if(ql<=mid)left=que(ql,qr,l,mid,2*i+1);
if(qr>=mid+1)right=que(ql,qr,mid+1,r,2*i+2);
return max(left,right);
}
void update(int l,int r,int target,int change,int i){
if(l==r&&l==target){
A[i]=change;
tree[i]=change;
return;
}
int left=0;
int right=0;
int mid=(l+r)/2;
if(target>mid){
left=tree[2*i+1];
update(mid+1,r,target,change,2*i+2);
right=tree[2*i+2];
tree[i]=max(left,right);
}
else{
update(l,mid,target,change,2*i+1);
left=tree[2*i+1];
right=tree[2*i+2];
tree[i]=max(left,right);
}
}
int main(){
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin>>n>>q;
for(int i=0;i<n;i++)cin>>A[i];
build(0,n-1,0);
while(q--){
int c,a,b;
cin>>c>>a>>b;
if(c==0){
a--;
b--;
cout<<que(a,b,0,n-1,0)<<endl;
}
else update(0,n-1,a-1,b,0);
}
}