#include<fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int Sg[500001],V[100001],n,m,op,x,y;
int ConstructSegmentTree(int node,int st,int dr){
if(st==dr){
Sg[node]=V[st];
return Sg[node];
}
int mid=(st+dr)/2;
Sg[node]=max(ConstructSegmentTree(2*node,st,mid),
ConstructSegmentTree(2*node+1,mid+1,dr));
return Sg[node];
}
int Query(int node,int st,int dr,int a,int b){
if(a<=st && dr<=b){
return Sg[node];
}
if(st>b || dr<a) return 0;
int mid=(st+dr)/2;
return max(Query(2*node,st,mid,a,b),
Query(2*node+1,mid+1,dr,a,b));
}
void Update(int node,int st,int dr,int i,int x){
if(st==dr && i==st){
Sg[node]=x;
return ;
}
if(st<=i && i<=dr){
int mid=(st+dr)/2;
Update(2*node,st,mid,i,x);
Update(2*node+1,mid+1,dr,i,x);
Sg[node]=max(Sg[2*node],Sg[2*node+1]);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>V[i];
ConstructSegmentTree(1,1,n);
while(m--){
cin>>op>>x>>y;
if(op==0) cout<<Query(1,1,n,x,y)<<'\n';
else Update(1,1,n,x,y);
}
}