#include <stdio.h>
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define MAXN 100000
int int_tree[2 * MAXN + 2];
void update(int node, int left, int right, int a, int b, int v)
{
if (a <= left && right <= b)
int_tree[node] = v;
else {
int mid = (left + right) / 2;
if (a <= mid)
update(node * 2, left, mid, a, b, v);
if (b > mid)
update(node * 2 + 1, mid + 1, right, a, b, v);
int_tree[node] = max(int_tree[node * 2], int_tree[node * 2 + 1]);
}
}
int query(int node, int left, int right, int a, int b)
{
int x = -1;
int y = -1;
if (a <= left && right <= b)
return int_tree[node];
else {
int mid = (left + right) / 2;
if (a <= mid)
x = query(node * 2, left, mid, a, b);
if (b > mid)
y = query(node * 2 + 1, mid + 1, right, a, b);
return max(x, y);
}
}
void print_array(int *v, int a, int b)
{
printf("[");
for (int i = a; i < b; i++)
printf("%d, ", v[i]);
printf("%d]\n", v[b]);
}
int main(void)
{
// read input
int n, m, x, a, b, q;
freopen("arbint.in", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
update(1, 1, n, i, i, x);
}
// write output
freopen("arbint.out", "w", stdout);
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &x, &a, &b);
if (x == 0) {
q = query(1, 1, n, a, b);
printf("%d\n", q);
} else
update(1, 1, n, a, a, b);
}
return 0;
}