#include <fstream>
using namespace std;
int arb[50001];
void update (int i, int x, int a, int b, int index)
{
int m = (a+b)/2;
if (a!=b)
{
if (i<=m)
update (i, x, a, m, index*2);
else
update (i, x, m+1, b, index*2+1);
}
else
{
arb[index] = x;
return;
}
arb[index] = max(arb[index*2], arb[index*2+1]);
}
int query (int a, int b, int st, int dr, int index)
{
int m = (st+dr)/2;
int maxl, maxr;
if (a<=st && b>=dr)
return arb[index];
if (a<=m)
maxl = query (a, b, st, m, index*2);
if (m<b)
maxr = query (a, b, m+1, dr, index*2+1);
return (max(maxl, maxr));
}
int main()
{
int n, m, t, x, a, b;
ifstream in("arbint.in");
ofstream out("arbint.out");
in>>n>>m;
for(int i=1; i<=n; i++)
{
in>>x;
update(i, x, 1, n, 1);
}
while(m--)
{
in>>t;
if (t==0)
{
in>>a>>b;
out<<query(a, b, 1, n, 1)<<"\n";
}
else
{
in>>a>>b;
update(a, b, 1, n, 1);
}
}
return 0;
}