#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int poz,val,t[1<<19];
void update(int nod,int l,int r)
{
int mij;
if(l==r) {t[nod]=val;return;}
mij=(l+r)>>1;
if(poz<=mij) update(nod<<1,l,mij);
else update((nod<<1)+1,mij+1,r);
t[nod]=max(t[nod<<1],t[(nod<<1)+1]);
}
int querry(int nod,int l,int r,int a,int b)
{
int x=0,y=0,m;
if(l==r) return t[nod];
m=(l+r)>>1;
if(a<=m) x=querry(nod<<1,l,m,a,b);
if(b>m) y=querry((nod<<1)+1,m+1,r,a,b);
return max(x,y);
}
int main()
{
int n,m,i,x,y;
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
poz=i;
val=x;
update(1,1,n);
}
int q;
for(i=1;i<=m;i++)
{
f>>q;
if(q==0)
{
f>>x>>y;
g<<querry(1,1,n,x,y)<<'\n';
}
else
{
f>>poz>>val;
update(1,1,n);
}
}
return 0;
}