#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
// maximum segment tree
class SegmentTree {
public:
SegmentTree(int n) : n(n) {
tree.resize(4 * n);
}
void update(int i, int val) {
update(i, val, 0, 0, n - 1);
}
int query(int l, int r) {
return query(l, r, 0, 0, n - 1);
}
int query(int l, int r, int i, int left, int right) {
if (l > right || r < left) return 0;
if (l <= left && right <= r) return tree[i];
int mid = (left + right) / 2;
return max(query(l, r, 2 * i + 1, left, mid) , query(l, r, 2 * i + 2, mid + 1, right));
}
void update(int i, int val, int idx, int left, int right) {
if (left == right) {
tree[idx] = val;
return;
}
int mid = (left + right) / 2;
if (i <= mid) update(i, val, 2 * idx + 1, left, mid);
else update(i, val, 2 * idx + 2, mid + 1, right);
tree[idx] = max(tree[2 * idx + 1] , tree[2 * idx + 2]);
}
int n;
vector<int> tree;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, q;
cin >> n >> q;
SegmentTree st(n);
for(int i = 0; i < n; i++){
int x;
cin >> x;
st.update(i, x);
}
while (q--) {
int t;
cin >> t;
if (t == 1) {
int i, val;
cin >> i >> val;
st.update(i-1, val);
} else {
int l, r;
cin >> l >> r;
cout << st.query(l-1, r-1) << endl;
}
}
}