#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int nmax=4e5;
int n,m,v[nmax],a,b,t;
void update(int a,int poz,int st,int dr,int nod)
{
if (st==dr) {v[nod]=a;
return;}
int mij=(st+dr)/2;
if (poz<=mij) update(a,poz,st,mij,2*nod);
else if (poz>mij) update(a,poz,mij+1,dr,2*nod+1);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
int query(int l,int r,int st,int dr,int nod)
{
int mij=(st+dr)/2;
if (st==l && dr==r) return v[nod];
if (r<=mij) return query(l,r,st,mij,2*nod);
else if (l>mij) return query(l,r,mij+1,dr,2*nod+1);
return max(query(l,mij,st,mij,2*nod),query(mij+1,r,mij+1,dr,2*nod+1));
}
int main()
{
fin >>n>>m;
for (int i=1;i<=n;i++)
{fin >>a;
update(a,i,1,n,1);}
for (int i=1;i<=m;i++)
{fin>>t>>a>>b;
if (t==1) update(b,a,1,n,1);
else fout<<query(a,b,1,n,1)<<'\n';}
return 0;
}