#include <bits/stdc++.h>
using namespace std;
class SegmentTree{
private:
vector<int> tree;
int N;
void build(int node, int l, int r, const vector<int> &v){
if (l == r){
tree[node] = v[l];
}
else{
int m = (l + r) / 2;
build(2 * node, l, m, v);
build(2 * node + 1, m + 1, r, v);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
void update(int node, int l, int r, int pos, int value){
if (l == r){
tree[node] = value;
}
else{
int m = (l + r) / 2;
if (pos <= m)
update(2 * node, l, m, pos, value);
else
update(2 * node + 1, m + 1, r, pos, value);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
}
int query(int node, int l, int r, int x, int y){
if (x <= l && r <= y)
return tree[node];
else{
int m = (l + r) / 2;
if (x <= m && m < y)
return max(query(2 * node, l, m, x, y),
query(2 * node + 1, m + 1, r, x, y));
else if (x <= m)
return query(2 * node, l, m, x, y);
else
return query(2 * node + 1, m + 1, r, x, y);
}
}
public:
SegmentTree(const vector<int>& v){
N = v.size();
tree.resize(4 * N);
build(1, 0, N - 1, v);
}
void update(int pos, int value){
update(1, 0, N - 1, pos, value);
}
int query(int x, int y){
return query(1, 0, N - 1, x, y);
}
};
int main() {
// ifstream cin("data.txt");
ifstream cin("arbint.in");
ofstream cout("arbint.out");
ios_base::sync_with_stdio(false);
int N, M;
cin >> N >> M;
vector<int> v(N);
for (int &x: v)
cin >> x;
SegmentTree st(v);
while (M--){
int t, x, y;
cin >> t >> x >> y;
if (t == 0){
cout << st.query(x - 1, y- 1) << "\n";
}
else{
st.update(x - 1, y);
}
}
return 0;
}