#include <bits/stdc++.h>
#define MAXN 100005
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
int x, a, b, arb[4*MAXN], n, m;
int query(int nod, int st, int dr, int a, int b)
{
if (a<=st && dr<=b)
return arb[nod];
int mij, left=0, right=0;
mij=(st+dr)/2;
if (a<=mij)
left=query(2*nod,st,mij,a,b);
if (b>mij)
right=query(2*nod+1,mij+1,dr,a,b);
return max(left,right);
}
void update(int nod, int st, int dr, int a, int b)
{
if (st==dr && st==a)
{
arb[nod]=b;
return;
}
int mij=(st+dr)/2;
if (a<=mij)
update(2*nod,st,mij,a,b);
else
update(2*nod+1,mij+1,dr,a,b);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
int main()
{
in >> n >> m;
for (int i=1; i<=n; i++)
{
in >> x;
update(1,1,n,i,x);
}
for (int i=1; i<=m; i++)
{
in >> x >> a >> b;
if (!x)
out << query(1,1,n,a,b) << '\n';
else
update(1,1,n,a,b);
}
return 0;
}