#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,v,a[100010][55],x,y,z;
int construire(int b,int e,int niv,int q)
{
if(b>e)
return 0;
if(b==e)
{
in>>v;
a[q][niv]=v;
return a[q][niv];
}
a[q][niv]=max(construire(e-(e-b+1)/2+1,e,niv+1,2*q),construire(b,e-(e-b+1)/2,niv+1,2*q-1));
return a[q][niv];
}
int modificare(int poz,int b,int e,int niv,int q)
{
if(b==e)
{
a[q][niv]=z;
return a[q][niv];
}
if(poz>=e-(e-b+1)/2+1)
a[q][niv]=max(modificare(poz,e-(e-b+1)/2+1,e,niv+1,2*q),a[2*q-1][niv+1]);
else
a[q][niv]=max(modificare(poz,b,e-(e-b+1)/2,niv+1,2*q-1),a[2*q][niv+1]);
return a[q][niv];
}
int maxim(int bi,int ei,int b,int e,int niv,int q)
{
if(ei<b||bi>e)
return 0;
if(bi<=b&&ei>=e)
return a[q][niv];
return max(maxim(bi,ei,b,e-(e-b+1)/2,niv+1,2*q-1),maxim(bi,ei,e-(e-b+1)/2+1,e,niv+1,2*q));
}
int main()
{
in>>n>>m;
construire(1,n,1,1);
for(int i=1;i<=m;++i)
{
in>>x>>y>>z;
if(x==1)
modificare(y,1,n,1,1);
else
out<<maxim(y,z,1,n,1,1)<<'\n';
}
return 0;
}