#include <fstream>
#define NMAX 200005
#define int long long
using namespace std;
int arbordeiaurt[4*NMAX];
int adunarequirky(int a, int b)
{
return max(a,b);
}
void apdaterecursiv(int x,int poz,int st,int dr,int clashroyale)
{
if(st==dr)
{
arbordeiaurt[clashroyale]=x;
return;
}
int midraudetot=st+dr;
midraudetot/=2;
if(poz<=midraudetot)
apdaterecursiv(x,poz,st,midraudetot,2*clashroyale);
else
apdaterecursiv(x,poz,midraudetot+1,dr,1+2*clashroyale);
arbordeiaurt[clashroyale]=adunarequirky(arbordeiaurt[2*clashroyale], arbordeiaurt[1+2*clashroyale]);
}
int intrebareintrebatoare(int qst, int qdr, int st, int dr, int clashroyale)
{
if(st==qst && dr==qdr) return arbordeiaurt[clashroyale];
int midraudetot=st+dr;
midraudetot/=2;
if(qdr<=midraudetot)
return intrebareintrebatoare(qst,qdr,st,midraudetot,2*clashroyale);
if(qst>midraudetot)
return intrebareintrebatoare(qst,qdr,midraudetot+1,dr,2*clashroyale+1);
return adunarequirky(intrebareintrebatoare(qst,midraudetot,st,midraudetot,2*clashroyale),intrebareintrebatoare(midraudetot+1,qdr,midraudetot+1,dr,2*clashroyale+1));
}
int32_t main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
apdaterecursiv(x,i,1,n,1);
}
for(int i=0;i<q;i++)
{
int cer;
cin>>cer;
if(cer==1)
{
int poz,x;
cin>>poz>>x;
apdaterecursiv(x,poz,1,n,1);
}
else
{
int st,dr;
cin>>st>>dr;
cout<<intrebareintrebatoare(st,dr,1,n,1)<<'\n';
}
}
return 0;
}