#include <fstream>
#include <iostream>
using namespace std;
ifstream F("arbint.in");
ofstream G("arbint.out");
const int N = 100010;
struct aint {
int a[N<<2],n;
void _update(int n,int l,int r,int p,int v)
{
if ( l == r )
{
a[n] = v;
return;
}
int m = (l + r) / 2;
if ( p <= m )
_update(n*2,l,m,p,v);
else
_update(n*2+1,m+1,r,p,v);
a[n] = max(a[n*2],a[n*2+1]);
}
int _query(int n,int l,int r,int il,int ir)
{
if ( l > ir || r < il ) return 0;
if ( il <= l && r <= ir ) return a[n];
int m = (l + r) / 2;
return max(_query(n*2,l,m,il,ir),_query(n*2+1,m+1,r,il,ir));
}
void update(int p,int v)
{
_update(1,1,n,p,v);
}
int query(int l,int r)
{
return _query(1,1,n,l,r);
}
};
int n,m;
aint a;
int main()
{
F>>n>>m;
a.n = n;
for (int i=1,x;i<=n;++i)
{
F>>x;
a.update(i,x);
}
for (int i=1,t,x,y;i<=m;++i)
{
F>>t>>x>>y;
if ( t == 1 )
a.update(x,y);
else
G<<a.query(x,y)<<'\n';
}
}