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