#include <fstream>
#include <climits>
using namespace std;
ifstream in ("divquery.in");
ofstream out ("divquery.out");
int v[100001],a[400004],cmm=0,max1;
void build (int nod,int st,int dr)
{
if (st==dr)
{
a[nod]=v[st];
return;
}
int mij=st+(dr-st)/2;
build(nod<<1,st,mij);
build(nod<<1|1,mij+1,dr);
a[nod]=max(a[nod<<1|1], a[nod<<1]);
}
void raspuns (int nod ,int st,int dr,int l,int r)
{
if (l<=st && dr<=r)
{
max1=max(max1,a[nod]);
return;
}
int mij=st+(dr-st)/2;
if (mij>=l)
raspuns(nod<<1,st,mij,l,r);
if (r>mij)
raspuns(nod<<1|1,mij+1,dr,l,r);
}
void update (int nod,int st,int dr,int l,int r,int value)
{
if (st==dr)
{
a[nod]=value;
return;
}
int mij=st+(dr-st)/2;
if (l<=mij)
update(nod<<1,st,mij,l,r,value);
if (r>mij)
update(nod<<1|1,mij+1,dr,l,r,value);
a[nod]=max(a[nod<<1],a[nod<<1|1]);
}
int main()
{
int n,m;
in>>n>>m;
for (int i=1;i<=n;++i)
in>>v[i];
build(1,1,n);
for (int i=1;i<=m;++i)
{
int caz;
in>>caz;
if (caz==0)
{
int l,r;
in>>l>>r;
max1=INT_MIN;
raspuns(1,1,n,l,r);
out<<max1<<'\n';
}
if (caz==1)
{
int l,r;
in>>l>>r;
update(1,1,n,l,l,r);
}
}
return 0;
}