#include <bits/stdc++.h>
using namespace std;
long long v[200005],aint[400005],n;
void update(int st,int dr,int nod,int poz,int val)
{
if(st==dr)
{
aint[nod]=val;
return;
}
if(poz<=(st+dr)/2)
{
update(st,(st+dr)/2,2*nod,poz,val);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
else
{
update((st+dr)/2+1,dr,2*nod+1,poz,val);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
int querry1(int st,int dr,int nod,int st1,int dr1)
{
if(st1<=st&&dr1>=dr)
{
return aint[nod];
}
int m=0;
if(st1<=(st+dr)/2)
{
m=max(m,querry1(st,(st+dr)/2,2*nod,st1,dr1));
}
if(dr1>(st+dr)/2)
{
m=max(m,querry1((st+dr)/2+1,dr,2*nod+1,st1,dr1));
}
return m;
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
long long m;
cin>>n>>m;
for(long long i=1; i<=n; i++)
{
cin>>v[i];
}
int put=1;
while(put<n)
{
put=put*2;
}
n=put;
for(int i=1;i<=n;i++)
{
update(1,n,1,i,v[i]);
}
long long t,a,b;
for(long long i=1; i<=m; i++)
{
cin>>t>>a>>b;
if(t==1)
{
update(1,n,1,a,b);
}
else
{
if(t==0)
{
cout<<querry1(1,n,1,a,b)<<"\n";
}
}
}
return 0;
}