#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m, tree[300000], k=0, a[100000];
void build_tree(int l, int r, int nod) {
if (l == r) {
tree[nod] = a[++k];
return;
}
int m = (l + r) / 2;
build_tree(l, m, 2 * nod);
build_tree(m + 1, r, 2 * nod + 1);
tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}
void update(int l, int r, int nod, int& pos, int& val) {
if (l == r) {
tree[nod] = val;
return;
}
int m = (l + r) / 2;
if (pos <= m) {
update(l, m, 2*nod, pos, val);
}
else {
update(m + 1, r, 2*nod+1, pos, val);
}
tree[nod] = max(tree[2 * nod], tree[2 * nod + 1]);
}
void query(int l, int r, int nod, int& x, int& y, int& res) {
if (x <= l && r <= y) {
res = max(res, tree[nod]);
return;
}
int m = (l + r) / 2;
if (x <= m) {
query(l, m, 2 * nod, x, y, res);
}
if (y > m) {
query(m + 1, r, 2 * nod + 1, x, y, res);
}
}
int main(void)
{
int op, x, y;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
a[i] = x;
}
build_tree(1, n, 1);
for (int i = 1; i <= m; i++) {
scanf("%d %d %d", &op, &x, &y);
if (op == 0) {
int res = 0;
query(1, n, 1, x, y, res);
printf("%d\n", res);
}
else {
update(1, n, 1, x, y);
}
}
cout << endl;
return 0;
}