#include <bits/stdc++.h>
using namespace std;
int n, m;
const int MAXN = 100000;
int aint[4 * MAXN];
int query(int node, int start, int end, int l, int r) {
if (l > end || r < start)
return INT_MIN;
if (l <= start && end <= r)
return aint[node];
int mid = (start + end) / 2;
int leftMax = query(2 * node, start, mid, l, r);
int rightMax = query(2 * node + 1, mid + 1, end, l, r);
return max(leftMax, rightMax);
}
void update(int node, int start, int end, int idx, int val) {
if(start == end)
aint[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);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
void build(vector<int>& arr, int node, int start, int end) {
if (start == end)
aint[node] = arr[start];
else{
int mid = (start + end) / 2;
build(arr, 2 * node, start, mid);
build(arr, 2 * node + 1, mid + 1, end);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#else
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
#endif
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; ++i)
cin >> a[i];
build(a, 1, 0, n-1);
for(int i=0; i<m; ++i){
int tip, aa, b;
cin >> tip >> aa >> b;
if(tip == 0)
cout << query(1, 0, n-1, aa-1, b-1) << '\n';
else
update(1, 0, n-1, aa-1, b);
}
return 0;
}