#include<fstream>
#define MAXN 100000
using namespace std;
int val[4*MAXN],poz[MAXN+1],m,n;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
void poz_frunze(int x,int y,int nod)
{
if(x==y)
poz[x]=nod;
else
{
poz_frunze(x,(x+y)>>1,2*nod);
poz_frunze(((x+y)>>1)+1,y,2*nod+1);
}
}
void actualizare(int nod)
{
int nnod=nod>>1,p=max(val[nnod<<1],val[(nnod<<1)+1]);
if(val[nnod]!=p)
{
val[nnod]=p;
actualizare(nnod);
}
}
void initializare()
{
fin>>n>>m;
poz_frunze(1,n,1);
for(int i=1;i<=n;i++)
{
fin>>val[poz[i]];
actualizare(poz[i]);
}
}
int cauta(int a,int b,int x,int y,int nod)
{
int m=(a+b)>>1;
if(a==x && b==y)
return val[nod];
if(x<=m)
{
if(y<=m)
return cauta(a,m,x,y,2*nod);
else
{
return max(cauta(a,m,x,m,2*nod),
cauta(m+1,b,m+1,y,2*nod+1)
);
}
}
else
return cauta(m+1,b,x,y,2*nod+1);
}
void rezolvare()
{
int op,a,b;
for(int i=1;i<=m;i++)
{
fin>>op>>a>>b;
if(op==1)
{
val[poz[a]]=b;
actualizare(poz[a]);
}
else
{
fout<<cauta(1,n,a,b,1)<<'\n';
}
}
}
int main()
{
initializare();
rezolvare();
return 0;
}