#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int a[100005],aint[400005];
int t,l,r;
int sz=1;
void update(int node,int from,int to,int p,int v)
{
if(to<p || from>p)
return;
if(from==to)
{
aint[node]=v;
return;
}
int mid=(from+to)/2;
update(2*node,from,mid,p,v);
update(2*node+1,mid+1,to,p,v);
aint[node]=max(aint[2*node],aint[2*node+1]);
}
int query(int node,int from,int to,int a,int b)
{
if(to<a || from>b)
return 0;
if(from>=a && to<=b)
return aint[node];
int mid=(from+to)/2;
return max(query(2*node,from,mid,a,b),query(2*node+1,mid+1,to,a,b));
}
int main()
{
fin>>n>>m;
int i;
for(i=1; i<=n; i++)
fin>>a[i];
while(sz<n)
sz*=2;
for(i=1; i<=sz; i++)
aint[i+sz-1]=a[i];
for(i=sz-1; i>=1; i--)
aint[i]=max(aint[2*i],aint[2*i+1]);
while(m--)
{
fin>>t>>l>>r;
if(t==0)
fout<<query(1,1,sz,l,r)<<"\n";
else
{
update(1,1,sz,l,r);
}
}
return 0;
}