#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
static long H[250000], N;
static long p(long a, long b)
{
long l;
if (b == 0)
return 1;
if (b == 1)
return a;
l = p(a, b >> 1);
if (b & 1)
return l * l * a;
return l * l;
}
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) >> 1);
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("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%ld %ld", &n, &m);
N = p(2, (long) log2(n) + 1);
for (i = 0; i < n; i++) {
scanf("%ld", &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;
}