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