#include <fstream>
#define nmax 100005
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int a[2*nmax],v[nmax],n;
void update(int st,int dr,int pos,int x,int nod)
{
if(st==dr)
a[nod]=x;
else
{ int mid=(st+dr)/2;
if(pos<=mid)
update(st,mid,pos,x,nod*2);
if(pos>mid)
update(mid+1,dr,pos,x,nod*2+1);
a[nod]=max(a[nod*2],a[nod*2+1]);
}
}
int query(int st,int dr,int aa,int b,int nod)
{
if(st>=aa&&dr<=b)
return a[nod];
int mid=(st+dr)/2;
int x=-1,y=-1;
if(aa<=mid)
x=query(st,mid,aa,b,nod*2);
if(b>mid)
y=query(mid+1,dr,aa,b,nod*2+1);
return max(x,y);
}
int main()
{ int m;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>v[i];
update(1,n,i,v[i],1);
}
for(int i=1;i<=m;++i)
{
int t,q1,q2;
cin>>t>>q1>>q2;
if(t==1)
update(1,n,q1,q2,1);
else
{
cout<<query(1,n,q1,q2,1)<<'\n';
}
}
return 0;
}