#include <stdio.h>
#define MAXN 100000
int n, m;
int a[MAXN + 1];
int tree[4 * MAXN + 5];
int max(int x, int y) {
return (x > y) ? x : y;
}
void build(int node, int st, int dr) {
if (st == dr) {
tree[node] = a[st];
return;
}
int mid = (st + dr) / 2;
build(node * 2, st, mid);
build(node * 2 + 1, mid + 1, dr);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
void update(int node, int st, int dr, int pos, int val) {
if (st == dr) {
tree[node] = val;
return;
}
int mid = (st + dr) / 2;
if (pos <= mid)
update(node * 2, st, mid, pos, val);
else
update(node * 2 + 1, mid + 1, dr, pos, val);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
int query(int node, int st, int dr, int l, int r) {
if (l <= st && dr <= r)
return tree[node];
int mid = (st + dr) / 2;
int ans = 0;
if (l <= mid)
ans = max(ans, query(node * 2, st, mid, l, r));
if (r > mid)
ans = max(ans, query(node * 2 + 1, mid + 1, dr, l, r));
return ans;
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
for (int i = 0; i < m; i++) {
int tip, x, y;
scanf("%d %d %d", &tip, &x, &y);
if (tip == 0)
printf("%d\n", query(1, 1, n, x, y));
else
update(1, 1, n, x, y);
}
return 0;
}