#include <fstream>
#include <algorithm>
#include <conio.h>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int H[500000],n,m,op,a,b,x,i,aux;
void actualizare(int nod, int st, int dr, int a, int b,int var)
{
int mij;
if (a<=st & b>=dr) H[nod]=var;
else {
mij=(st+dr)/2;
if (a<=mij) actualizare(2*nod,st,mij,a,b,var);
if (b>mij) actualizare(2*nod+1,mij+1,dr,a,b,var);
H[nod]=max(H[2*nod],H[2*nod+1]);
}
}
int interogare (int nod,int st, int dr,int a, int b)
{
int mij;
if (a<=st & b>=dr) return H[nod];
else {
mij=(st+dr)/2;
if (a<=mij) return interogare(2*nod,st,mij,a,b);
if (b>mij) return interogare(2*nod+1,mij+1,dr,a,b);
return max(interogare(2*nod,st,mij,a,mij),interogare(2*nod+1,mij+1,dr,mij+1,b));
}
}
int main()
{
cin>>n>>m;
for (i=1;i<=n;i++) {
cin>>aux;
actualizare(1,1,n,i,i,aux);
}
for (i=1;i<=m;i++) {
cin>>aux>>a>>b;
if (aux==0) cout<<interogare(1,1,n,a,b)<<"\n";
if (aux==1) actualizare(1,1,n,a,a,b);
}
}