#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int nmax=100001;
int aint[4*nmax];
int v[nmax];
void build(int node,int left,int right)
{
if(left==right)
{
aint[node]=v[left];
return;
}
int mid=(left+right)/2;
build(2*node,left,mid);
build(2*node+1,mid+1,right);
aint[node]=max(aint[2*node],aint[2*node+1]);
}
void update(int node,int left,int right,int poz,int value)
{
if(left==right)
{
aint[node]=value;
return;
}
int mid=(left+right)/2;
if(poz<=mid)
update(2*node,left,mid,poz,value);
else
update(2*node+1,mid+1,right,poz,value);
aint[node]=max(aint[2*node],aint[2*node+1]);
}
int querry(int node,int left,int right,int qleft,int qright)
{
if(qleft<=left&&qright>=right)
return aint[node];
int mid,ans=0;
mid=(left+right)/2;
if(qleft<=mid)
ans=max(ans,querry(2*node,left,mid,qleft,qright));
if(mid<qright)
ans=max(ans,querry(2*node+1,mid+1,right,qleft,qright));
return ans;
}
int main()
{
int n,i,q;
cin>>n>>q;
for(i=0;i<n;i++)
cin>>v[i];
build(1,0,n-1);
for(i=1;i<=q;i++)
{
int left,right,t;
cin>>t;
if(t==0)
{
cin>>left>>right;
left--;
right--;
if(left>right)
swap(left,right);
cout<<querry(1,0,n-1,left,right)<<'\n';
}
if(t==1)
{
int poz,val;
cin>>poz>>val;
poz--;
update(1,0,n-1,poz,val);
}
}
return 0;
}