#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[400001],n,x,m,t,a,b;
void update(int nod,int x,int p,int st,int dr)
{
if(st==dr)aint[nod]=x;
else
{
int mid=(st+dr)/2;
if(p<=mid)update(2*nod,x,p,st,mid);
else update(2*nod+1,x,p,mid+1,dr);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
int maxim(int nod,int st,int dr,int a,int b)
{
if(a<=st&&dr<=b)return aint[nod];
else
{
int mid=(st+dr)/2,r1=0,r2=0;
if(a<=mid)r1=maxim(2*nod,st,mid,a,b);
if(mid<b)r2=maxim(2*nod+1,mid+1,dr,a,b);
return max(r1,r2);
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>x;
update(1,x,i,1,n);
}
for(int i=1;i<=m;i++)
{
fin>>t>>a>>b;
if(t)update(1,b,a,1,n);
else
{
fout<<maxim(1,1,n,a,b)<<'\n';
}
}
}