#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int tree[400005];
static void build(int node, int l, int r) {
if (l == r) fin >> tree[node];
else {
int mid = (l + r) >> 1;
build(node << 1, l, mid);
build((node << 1) | 1, mid + 1, r);
tree[node] = max(tree[node << 1], tree[(node << 1) | 1]);
}
}
static void update(int node, int l, int r, int pos, int val) {
if (l == r) tree[node] = val;
else {
int mid = (l + r) >> 1;
if (pos <= mid) update(node << 1, l, mid, pos, val);
else update((node << 1) | 1, mid + 1, r, pos, val);
tree[node] = max(tree[node << 1], tree[(node << 1) | 1]);
}
}
static int query(int node, int l, int r, int a, int b) {
if (a <= l && r <= b) return tree[node];
else {
int mid = (l + r) >> 1;
int ans1 = 0, ans2 = 0;
if (a <= mid) ans1 = query(node << 1, l, mid, a, b);
if (mid < b) ans2 = query((node << 1) | 1, mid + 1, r, a, b);
return max(ans1, ans2);
}
}
int N, M, type, a, b;
int main() {
fin >> N >> M;
build(1, 1, N);
for (int i = 1; i <= M; ++i) {
fin >> type >> a >> b;
if (type == 0) fout << query(1, 1, N, a, b) << '\n';
else update(1, 1, N, a, b);
}
fin.close();
fout.close();
return 0;
}