#include <iostream>
#include <cstdio>
using namespace std;
struct operatie
{
int tipulOperatiei;
int stanga;
int dreapta;
} vOperatii[100001];
int m,n,v[100001],a[500000],maxInterval;
void citire()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&v[i]);
for(int i=1; i<=m; i++)
scanf("%d%d%d",&vOperatii[i].tipulOperatiei,&vOperatii[i].stanga,&vOperatii[i].dreapta);
}
void constructieArbore(int pai,int st,int dr)
{
if(st==dr)
{
a[pai]=v[st];
return;
}
int mij=(st+dr)/2;
constructieArbore(2*pai,st,mij);
constructieArbore(2*pai+1,mij+1,dr);
a[pai]=max(a[2*pai],a[2*pai+1]);
}
void updateArbore(int pai,int st,int dr,int cetrebuieSchimbat,int cuCeTrebuieSchimbat)
{
if(st==dr)
{
a[pai]=cuCeTrebuieSchimbat;
return;
}
int mij=(st+dr)/2;
if(mij>=cetrebuieSchimbat)
updateArbore(2*pai,st,mij,cetrebuieSchimbat,cuCeTrebuieSchimbat);
else
updateArbore(2*pai+1,mij+1,dr,cetrebuieSchimbat,cetrebuieSchimbat);
a[pai]=max(a[2*pai],a[2*pai+1]);
}
void aflareMaxim(int pai,int st,int dr,int intervalS,int intervalD)
{
if(st>=intervalS&&dr<=intervalD)
{
maxInterval=max(maxInterval,a[pai]);
return;
}
int mij=(st+dr)/2;
if(mij>=intervalS)
aflareMaxim(pai*2,st,mij,intervalS,intervalD);
if(mij<intervalD)
aflareMaxim(pai*2+1,mij+1,dr,intervalS,intervalD);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
constructieArbore(1,1,n);
for(int i=1;i<=m;i++)
if(vOperatii[i].tipulOperatiei)
updateArbore(1,1,n,vOperatii[i].stanga,vOperatii[i].dreapta);
else
{
maxInterval=0;
aflareMaxim(1,1,n,vOperatii[i].stanga,vOperatii[i].dreapta);
printf("%d\n",maxInterval);
}
return 0;
}