#include <iostream>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <set>
#include <utility>
#include <vector>
using namespace std;
int a[100001], aint[400005];
void build(int node, int l, int r) {
if (l == r) {
aint[node] = a[l];
return;
}
int mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
void update(int node, int l, int r, int pos, int val) {
if (l == r) {
aint[node] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid) update(node * 2, l, mid, pos, val);
else update(node * 2 + 1, mid + 1, r, pos, val);
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
int query(int node, int l, int r, int ql, int qr) {
if (qr < l || r < ql) return 0;
if (ql <= l && r <= qr) return aint[node];
int mid = (l + r) / 2;
return max(query(node * 2, l, mid, ql, qr), query(node * 2 + 1, mid + 1, r, ql, qr));
}
int main() {
int n, q, t, x, y;
cin >> n >> q;
for (int i=1; i<=n; i++) cin >> a[i];
build(1, 1, n);
for (int i=1; i<=q; i++) {
cin >> t >> x >> y;
if (t == 0) cout << query(1, 1, n, x, y) << '\n';
else update(1, 1, n, x, y);
}
}