#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
#define MAX 100010
int A[MAX * 4];
int N,M;
void update(int p,int x,int a,int b,int k)
{
if (a == b && a == p)
A[k] = x;
else
{
if (p > (a + b) / 2)
update(p, x, (a + b) / 2 + 1, b, k * 2 + 1);
else
update(p, x, a, (a + b) / 2, k * 2);
A[k] = max(A[k * 2], A[k * 2 + 1]);
}
}
int query(int a, int b ,int x,int y,int k)
{
if (a == x && b == y)
return A[k];
int e1=0, e2=0;
if (a <= (x + y) / 2 && b>(x+y)/2)
{
e1 = query(a, (x + y) / 2, x, (x + y) / 2, 2 * k);
e2 = query((x + y) / 2 + 1, b, (x + y) / 2 + 1, y, 2 * k + 1);
}
else if(a<=(x+y)/2)
e1 = query(a, b , x, (x + y) / 2, 2 * k);
else if(b>(x+y)/2)
e1 = query(a, b, (x+y)/2+1, y, 2 * k + 1);
return max(e1, e2);
}
int main()
{
in >> N >> M;
for (int i = 1;i <= N;++i)
{
int x;
in >> x;
update(i,x, 1, N, 1);
}
for (int i = 1;i <= M;++i)
{
int op,a,b;
in >> op >> a >> b;
if (op == 0)
out << query(a, b, 1, N, 1)<<'\n';
else
{
update(a, b, 1, N, 1);
}
}
return 0;
}