#include <bits/stdc++.h>
using namespace std;
class SegmentTree {
private:
int n;
vector<long long> tree;
void build(vector<long long>& arr, int node, int start, int end) {
if (start == end) {
tree[node] = arr[start];
} else {
int mid = (start + end) / 2;
build(arr, 2 * node, start, mid);
build(arr, 2 * node + 1, mid + 1, end);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
long long query(int node, int start, int end, int l, int r) {
if (r < start || end < l) return LLONG_MIN;
if (l <= start && end <= r) return tree[node];
int mid = (start + end) / 2;
long long left = query(2 * node, start, mid, l, r);
long long right = query(2 * node + 1, mid + 1, end, l, r);
return max(left, right);
}
void update(int node, int start, int end, int idx, long long val) {
if (start == end) {
tree[node] = val;
} else {
int mid = (start + end) / 2;
if (idx <= mid) update(2 * node, start, mid, idx, val);
else update(2 * node + 1, mid + 1, end, idx, val);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
public:
SegmentTree(vector<long long>& arr) {
n = arr.size() - 1;
tree.resize(4 * n);
build(arr, 1, 1, n);
}
long long query(int l, int r) {
return query(1, 1, n, l, r);
}
void update(int idx, long long val) {
update(1, 1, n, idx, val);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<long long> A(N + 1);
for (int i = 1; i <= N; i++) cin >> A[i];
SegmentTree st(A);
for (int i = 0; i < M; i++) {
int type, a, b;
cin >> type >> a >> b;
if (type == 0) {
cout << st.query(a, b) << "\n";
} else {
st.update(a, b);
}
}
return 0;
}