#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arbore[400001],max1;
void godeep(int nod,int val,int a,int b,int poz)
{
if(a==b)
{
arbore[nod]=val;
return;
}
int mij=(a+b)/2;
if(poz<=mij)
godeep(2*nod,val,a,mij,poz);
if(poz>mij)
godeep(2*nod+1,val,mij+1,b,poz);
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}
void query(int nod,int a,int b,int ua,int ub)
{
if(a>=ua&&b<=ub)
max1=max(max1,arbore[nod]);
else
{
int mij=(a+b)/2;
if(ua<=mij)
query(2*nod,a,mij,ua,ub);
if(ub>mij)
query(2*nod+1,mij+1,b,ua,ub);
}
}
int main()
{
int n,m,a,b,c,i,x;
in>>n>>m;
for(i=1; i<=n; i++)
{
in>>x;
godeep(1,x,1,n,i);
}
for(i=1; i<=m; i++)
{
in>>c>>a>>b;
if(c==1)
godeep(1,b,1,n,a);
else
{
max1=0;
query(1,1,n,a,b);
out<<max1<<'\n';
}
}
return 0;
}