#include <fstream>
#include <iostream>
#define nmax 200000
using namespace std;
unsigned n,m,nr,arb[400002];
unsigned maxim(unsigned a, unsigned b)
{
if(a>b)return a;
return b;
}
void update(unsigned nod, unsigned st, unsigned dr,unsigned pos, unsigned val)
{
if(st>=pos && dr<=pos)
{
arb[nod]=val;
}
else
{
unsigned mijl=(st+dr)>>1;
if(pos<=mijl)
update((nod<<1),st, mijl, pos, val);
else
update((nod<<1)+1,mijl+1, dr, pos, val);
arb[nod] = maxim(arb[nod<<1],arb[(nod<<1)+1]);
}
}
unsigned query(unsigned nod, unsigned st, unsigned dr,unsigned a,unsigned b)
{
if(st>=a && dr<=b)
{
return arb[nod];
}
else
{
unsigned mijl=(st+dr)>>1;
if(a<=mijl && b<=mijl)
query(nod<<1,st, mijl, a, b);
else if(a>mijl && b>mijl)
query((nod<<1)+1,mijl+1,dr,a,b);
else
return maxim(query(nod<<1,st, mijl, a, mijl),query((nod<<1)+1,mijl+1, dr, mijl+1, b));
}
}
int main()
{
unsigned i,t,a,b;
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
cout<< (4<<1);
for(i=1;i<=n;i++)
{
f>>nr;
update(1,1,n,i,nr);
}
for(i=1;i<=m;i++)
{
f>>t>>a>>b;
if(t==0)g<<query(1,1,n,a,b)<<'\n';
else update(1,1,n,a,b);
}
return 0;
}