#include<bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[100005],n,m;
struct elem
{
int x,poz;
}aint[4*100005];
elem join(elem a, elem b)
{
elem c;
if(a.x>b.x)
c.x=a.x,c.poz=a.poz;
else
c.x=b.x,c.poz=b.poz;
return c;
}
void update(int nod, int st, int dr, int poz, int val)
{
if(st==dr)
aint[nod].x=val,aint[nod].poz=poz;
else
{
int mij=(st+dr)/2;
if(poz<=mij)
update(2*nod,st,mij,poz,val);
else
update(2*nod+1,mij+1,dr,poz,val);
aint[nod]=join(aint[2*nod],aint[2*nod+1]);
}
}
elem query(int nod, int st, int dr, int l, int r)
{
if(st==l && dr==r)
return aint[nod];
else
{
int mij=(st+dr)/2;
if(r<=mij)
return query(2*nod,st,mij,l,r);
else
if(l>=mij+1)
return query(2*nod+1,mij+1,dr,l,r);
else
return join(query(2*nod,st,mij,l,mij),query(2*nod+1,mij+1,dr,mij+1,r));
}
}
int main()
{
int i,nr,a,b,t;
f>>n>>m;
for(i=1;i<=n;i++)
f>>v[i],update(1,1,n,i,v[i]);
for(i=1;i<=m;i++)
{
f>>t>>a>>b;
if(t==1)
update(1,1,n,a,b);
else
{
g<<query(1,1,n,a,b).x<<'\n';
//g<<query(1,1,n,a,b).poz<<'\n';
}
}
return 0;
}