#include <fstream>
using namespace std;
long long st[400001];
void update(long long node,long long from,long long to,long long pos,long long val)
{
if(from==to)
{
st[node]=val;
return;
}
long long mid=(from+to)/2;
if(pos<=mid)
update(node*2,from,mid,pos,val);
else
update(node*2+1,mid+1,to,pos,val);
st[node]=max(st[node*2],st[node*2+1]);
}
long long query(long long node,long long from,long long to,long long l,long long r)
{
long long smin=0;
if(l<=from&&to<=r)
{
return st[node];
}
long long mid=(from+to)/2;
if(l<=mid)
{
long long s=query(node*2,from,mid,l,r);
smin=max(smin,s);
}
if(mid+1<=r)
{
long long s=query(node*2+1,mid+1,to,l,r);
smin=max(smin,s);
}
return smin;
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
long long n,t,a,b,c;
cin>>n>>t;
for(long long i=1;i<=n;i++)
{
long long x;
cin>>x;
update(1,1,n,i,x);
}
for(long long i=0;i<t;i++)
{
cin>>a>>b>>c;
if(a==1)
{
update(1,1,n,b,c);
}
else
{
cout<<query(1,1,n,b,c)<<'\n';
}
}
return 0;
}
//100000000000000