#include<fstream>
using namespace std;
const char iname[]="arbint.in";
const char oname[]="arbint.out";
const int maxn=200005;
int arb[maxn*2],i,n,t,x,y,lg,m;
ifstream f(iname);
ofstream g(oname);
void update(int nod,int left,int right,int pos,int value)
{
if(left==right)
{
arb[nod]=value;
return;
}
int div=(left+right)>>1;
if(pos<=div)
update(nod<<1,left,div,pos,value);
else
update((nod<<1)+1,div+1,right,pos,value);
arb[nod]=max(arb[nod<<1],arb[(nod<<1)+1]);
}
int query(int nod,int left,int right,int start,int finish)
{
if(start<=left&&right<=finish)
{
return arb[nod];
}
int k=-0x3f3f3f3f;
int div=(left+right)>>1;
if(start<=div)
k=max(k,query(nod<<1,left,div,start,finish));
if(div<finish)
k=max(k,query((nod<<1)+1,div+1,right,start,finish));
return k;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
{
f>>x;
update(1,1,n,i,x);
}
for(i=1;i<=m;++i)
{
f>>t>>x>>y;
if(t==1)
update(1,1,n,x,y);
else
g<<query(1,1,n,x,y)<<"\n";
}
f.close();
g.close();
return 0;
}