#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int A[2000000],N,M;
void update(int i, int j,int p, int v,int k)
{
if (i != j)
{
if (p > (i + j) / 2)
update((i + j) / 2 + 1, j, p,v, 2 * k + 1);
else
update(i, (i + j) / 2, p, v, 2 * k);
if (A[2 * k + 1] > A[2 * k])
A[k] = A[2 * k + 1];
else
A[k] = A[2 * k];
}
else
A[k] = v;
}
int query(int i,int j,int i1,int j1,int k)
{
if (i == i1 && j == j1)
return A[k];
int mij = (i + j) / 2;
if (i1 <= mij && j1 > mij)
{
int a, b;
a=query(i, mij, i1, mij, 2 * k);
b=query(mij + 1, j, mij + 1, j1, 2 * k + 1);
return a>b ? a : b;
}
else if (j1 <= mij)
{
return query(i, mij, i1, j1, 2*k);
}
else
{
return query(mij + 1, j, i1, j1, 2 * k + 1);
}
}
int main()
{
in >> N >> M;
int q,a,b;
for (int i = 1;i <= N;++i)
{
in >> q;
update(1, N, i, q, 1);
}
for (int i = 1;i <= M;++i)
{
in >> q>>a>>b;
if (q == 0)
out << query(1,N,a,b,1)<<'\n';
else
update(1, N, a, b, 1);
}
return 0;
}