#include <stdio.h>
#include <stdlib.h>
#define MAXN 100005
long long A[MAXN];
long long tree[4 * MAXN];
long long N, M;
void build(long long node, long long l, long long r) {
if (l == r) {
tree[node] = A[l];
} else {
long long mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
tree[node] = (tree[2 * node] > tree[2 * node + 1]) ? tree[2 * node] : tree[2 * node + 1];
}
}
long long query(long long node, long long l, long long r, long long ql, long long qr) {
if (qr < l || ql > r) return -1LL;
if (ql <= l && r <= qr) return tree[node];
long long mid = (l + r) / 2;
long long st = query(2 * node, l, mid, ql, qr);
long long dr = query(2 * node + 1, mid + 1, r, ql, qr);
return (st > dr) ? st : dr;
}
void update(long long node, long long l, long long r, long long pos, long long val) {
if (l == r) {
tree[node] = val;
} else {
long long mid = (l + r) / 2;
if (pos <= mid)
update(2 * node, l, mid, pos, val);
else
update(2 * node + 1, mid + 1, r, pos, val);
tree[node] = (tree[2 * node] > tree[2 * node + 1]) ? tree[2 * node] : tree[2 * node + 1];
}
}
int main() {
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
fscanf(fin, "%lld %lld", &N, &M);
for (long long i = 0; i < N; i++) {
fscanf(fin, "%lld", &A[i]);
}
build(1, 0, N - 1);
for (long long i = 0; i < M; i++) {
long long op, a, b;
fscanf(fin, "%lld %lld %lld", &op, &a, &b);
a--;
if (op == 0) {
b--;
long long res = query(1, 0, N - 1, a, b);
fprintf(fout, "%lld\n", res);
} else {
update(1, 0, N - 1, a, b);
}
}
fclose(fin);
fclose(fout);
return 0;
}