#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int nmax=100000;
int adi[4*nmax],n,m,op,a,b,x;
void Actualizare(int nod, int st, int dr, int care, int cat)
{
if (st==dr) adi[nod]=cat; else
{
int mij=(st+dr)/2;
if (care<=mij)
Actualizare(2*nod,st,mij,care,cat);
else
Actualizare(2*nod+1,mij+1,dr,care,cat);
adi[nod]=max(adi[2*nod],adi[2*nod+1]);
}
}
int scoate(int nod,int st, int dr,int a, int b)
{
if (st==a && dr==b)
return adi[nod];
int mij=(st+dr)/2;
if (b<=mij)
return scoate(2*nod,st,mij,a,b);
if (a>mij)
return scoate(2*nod+1,mij+1,dr,a,b);
return max(scoate(2*nod,st,mij,a,mij),scoate(2*nod+1,mij+1,dr,mij+1,b));
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>x,
Actualizare(1,1,n,i,x);
while (m--)
{
cin>>op>>a>>b;
if (op==0)
cout<<scoate(1,1,n,a,b)<<"\n";
else
Actualizare(1,1,n,a,b);
}
}