#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,vec[100000],ai[400000],x,y,sol;
class arb
{
public:
void creare(int st, int dr, int pai);
void cautare(int st, int dr, int pai);
void refresh(int st, int dr, int pai);
};
void arb::creare(int st, int dr, int pai)
{
if(st==dr)
{
ai[pai]=vec[st];
return;
}
int mij=(st+dr)>>1;
creare(st,mij,2*pai);
creare(mij+1,dr,2*pai+1);
ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}
void arb::cautare(int st, int dr,int pai)
{
if(st==dr || x <= st && dr <= y)
{
sol=max(ai[pai],sol);
return;
}
int mij=(st+dr)>>1;
if(x<=mij)
{
cautare(st,mij,2*pai);
}
if(y>mij)
{
cautare(mij+1,dr,2*pai+1);
}
}
void arb::refresh(int st, int dr, int pai)
{
if(st==dr && st==x)
{
ai[pai]=y;
return;
}
int mij=(st+dr)>>1;
if(x<=mij)
{
refresh(st,mij,2*pai);
}
if(x>mij)
{
refresh(mij+1,dr,2*pai+1);
}
ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}
void citire()
{
int m;
arb arbore;
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d ",&vec[i]);
}
arbore.creare(1,n,1);
for(int i=0; i<m; i++)
{
int op;
scanf("%d %d %d",&op,&x,&y);
if(op==1)
{
arbore.refresh(1,n,1);
}
else
{
sol=0;
arbore.cautare(1,n,1);
printf("%d\n",sol);
}
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
return 0;
}