#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int nr,nra,n,m,o,v[100005],i,j,pos[100005],a,b,li,lf;
struct nod
{
int t,f1,f2,mx;
} p, arb[160000];
int makearb(int st,int dr)
{
int md=st+(dr-st)/2, id=nr;
if(st==dr)
{
arb[id].mx=v[st];
pos[st]=nr;
}
else
{
nr++;
arb[nr].t=id;
arb[id].f1=nr;
arb[id].mx=makearb(st,md);
nr++;
arb[nr].t=id;
arb[id].f2=nr;
arb[id].mx=max(arb[id].mx,makearb(md+1,dr));
}
return arb[id].mx;
}
int maxab(int nr,int st,int dr)
{
int md=st+(dr-st)/2,r=0;
li=st; lf=md;
if(li>=a&&lf<=b) r=max(r,arb[arb[nr].f1].mx);
else if(max(li,a)<=min(lf,b)) r=maxab(arb[nr].f1,li,lf);
li=md+1;lf=dr;
if(li>=a&&lf<=b) r=max(r,arb[arb[nr].f2].mx);
else if(max(li,a)<=min(lf,b)) r=maxab(arb[nr].f2,li,lf);
return r;
}
void update(int a,int b)
{
int nr=pos[a];
arb[nr].mx=b;
while(nr!=1)
{
nr=arb[nr].t;
arb[nr].mx=max(arb[arb[nr].f1].mx,arb[arb[nr].f2].mx);
}
}
int main() {
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
nr=1;
makearb(1,n);
nra=nr;
for(i=1;i<=m;i++)
{
fin>>o>>a>>b;
if(o==0) fout<<maxab(1,1,n)<<"\n";
if(o==1) update(a,b);
}
}