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