#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int i,n,v[100001],aint[400001],a,b,m,c;
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&&b>=dr)
return aint[nod];
int mid=(st+dr)/2,r1=-1e9,r2=-1e9;
if (a<=mid) r1=maxim(2*nod,st,mid,a,b);
if (b>mid) r2=maxim(2*nod+1,mid+1,dr,a,b);
return max(r1,r2);
}
int main()
{
fin>>n>>m;
for (i=1; i<=4*n; i++) aint[i]=1e9;
for (i=1; i<=n; i++)
{
fin>>v[i];
update (1,v[i],i,1,n);
}
for (i=1;i<=m;i++)
{
fin>>a>>b>>c;
if (a==0)
fout<<maxim(1,1,n,b,c)<<'\n';
else update(1,c,b,1,n);
}
return 0;
}