#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[100005], aint[400005],nod,x,y,sol,poz,val,nr1,nr2,n,m,i,op;
void init(int nod, int l, int r){
if(l==r) { aint[nod]=a[l];}
else{
int mid=(l+r)/2;
init(2*nod, l, mid);
init(2*nod+1, mid+1, r);
aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
}
void update(int nod, int l, int r) // Global : poz, val
{
if(l==r) {aint[nod]=val;}
else{
int mid=(l+r)/2;
if(poz>mid) update(2*nod+1, mid+1, r);
else update(2*nod, l, mid);
aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
}
void query(int nod, int l, int r) // Global : x, y, sol
{
if(l>=x && r<=y) {sol=max(sol,aint[nod]);}
else{
int mid=(l+r)/2;
if(x<=mid) query(2*nod, l, mid);
if(y>mid) query(2*nod+1, mid+1, r);
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>a[i];
init(1, 1, n);
for(i=1;i<=m;i++)
{
fin>>op>>nr1>>nr2;
if(op==1){
poz=nr1;
val=nr2;
update(1, 1, n);
}
else{
sol=0;
x=nr1;
y=nr2;
query(1, 1, n);
fout<<sol<<'\n';
}
}
return 0;
}