#include <stdio.h>
#include <math.h>
#define IN "arbint.in"
#define OUT "arbint.out"
#define NMAX 200002
static long H[NMAX], N;
long max(long a, long b)
{
if (a > b)
return a;
return b;
}
static void update(long i, long x)
{
long nod = N + i;
H[N + i] = x;
while (nod >>= 1)
H[nod] = max(H[nod << 1], H[(nod << 1) + 1]);
}
static long query(long nod, long st, long dr, long a, long b)
{
long mid, s, d;
if (a <= st && dr <= b)
return H[nod];
else {
mid = st + (dr - st) / 2;
s = d = 0;
if (a <= mid)
s = query(2 * nod, st, mid, a, b);
if (b > mid)
d = query(2 * nod + 1, mid + 1, dr, a, b);
return max(s, d);
}
}
int main(void)
{
long n, m, i, op, a, b;
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
scanf("%ld %ld", &n, &m);
N = pow(2, (long) log2(n) + 1); /* optimize */
for (i = 0; i < n; i++) {
scanf("%d", &H[N + i]);
update(i, H[N + i]);
}
for (i = 0; i < m; i++) {
scanf("%ld %ld %ld", &op, &a, &b);
if (op == 0)
printf("%ld\n", query(1, 0, N - 1, a - 1, b - 1));
else
update(a - 1, b);
}
return 0;
}