#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a,n,m;
int arbore[400009];
int val;
void update(int st, int dr, int poz, int nr, int i)
{
if (st>poz || dr<poz || st>dr)
{
return;
}
if (st==dr)
{
arbore[i]=nr;
return;
}
int mij=(st+dr)/2;
update (st,mij,poz,nr,2*i);
update (mij+1,dr,poz,nr,2*i+1);
arbore[i]=max(arbore[i*2],arbore[i*2+1]);
}
int query (int st,int dr,int ist,int idr,int i)
{
if (st==ist && dr==idr)
{
return arbore[i];
}
int mij=(st+dr)/2;
if (idr<=mij)
{
return query(st,mij,ist,idr,2*i);
}else
{
if (ist>mij)
{
return query(mij+1,dr,ist,idr,2*i+1);
}
else
{
return max(query(st,mij,ist,mij,2*i),query(mij+1,dr,mij+1,idr,2*i+1));
}
}
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
{
fin>>val;
update(1,n,i,val,1);
}
for(int j=1; j<=m; j++)
{
int x,a,b;
fin>>x>>a>>b;
if(x==0) fout<<query(1, n, a, b, 1)<<"\n";
else update(1, n, a, b, 1);
}
}