#include <cstdio>
#define MAXN 300011
#define left(x) ((x) << 1)
#define right(x) (((x) << 1) + 1)
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int N, A[MAXN], elem, value, li, ls;
void update(int li, int ls, int ind)
{
if (li > ls)
return;
if (ls < elem || li > elem)
return;
if (li == ls)
{
A[ind] = value;
return;
}
int mij = (li + ls) / 2;
update(li, mij, left(ind));
update(mij + 1, ls, right(ind));
A[ind] = MAX(A[left(ind)], A[right(ind)]);
}
int query(int b, int e, int ind)
{
if (b > e)
return 0;
if (b > ls || e < li)
return 0;
if (b >= li && e <= ls)
return A[ind];
int mij = (b + e) / 2;
int leftValue = query(b, mij, left(ind));
int rightValue = query(mij + 1, e, right(ind));
return MAX(leftValue, rightValue);
}
void readDataAndSolve()
{
int M;
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++)
{
elem = i;
scanf("%d", &value);
update(0, N - 1, 1);
}
for (int i = 0; i < M; i++)
{
int tip, a, b;
scanf("%d %d %d", &tip, &a, &b);
if (tip == 0)
{
a--, b--;
li = a, ls = b;
printf("%d\n", query(0, N - 1, 1));
}
else
{
a--;
elem = a;
value = b;
update(0, N - 1, 1);
}
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
readDataAndSolve();
return 0;
}