#include<iostream>
#include<fstream>
#define DN 100100
using namespace std;
fstream fin("arbint.in",ios::in),fout("arbint.out",ios::out);
int arb[4*DN],n,m;
int find(int a,int b,int ind,int nod)
{
int m;
if(a==b) return nod;
m=(a+b)/2;
if(a<=ind && ind<=m) return find(a,m,ind,nod*2);
if(m<ind && ind<=b) return find(m+1,b,ind,nod*2+1);
}
void update(int nod)
{
if(nod==0) return ;
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
update(nod/2);
}
int query(int nod,int st,int dr,int a,int b)
{
int m=(st+dr)/2,aux=0;
if(a<=st && dr<=b) return arb[nod];
if(!(b<st || m<a)) aux=max(aux,query(nod*2,st,m,a,b));
if(!(b<=m || dr<a)) aux=max(aux,query(nod*2+1,m+1,dr,a,b));
return aux;
}
int main()
{
int i,t,a,b,poz;
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>a;
poz=find(1,n,i,1);
arb[poz]=a;
update(poz/2);
}
for(i=1;i<=m;i++)
{
fin>>t>>a>>b;
if(t==1)
{
poz=find(1,n,a,1);
arb[poz]=b;
update(poz/2);
}
else
{
fout<<query(1,1,n,a,b)<<"\n";
}
}
}