#include <bits/stdc++.h>
using namespace std;
struct SegmentTree {
vector<int>aint;
SegmentTree(int n = 1) {
aint.resize(2 * n + 1);
}
void update(int x, int l, int r, int at, int with) {
if(l == r) {
aint[x] = with;
return;
}
int m = (l + r) >> 1;
int lson = x + 1, rson = x + ((m - l + 1) << 1);
if(at <= m)
update(lson, l, m, at, with);
else
update(rson, m + 1, r, at, with);
aint[x] = max(aint[lson], aint[rson]);
}
int query(int x, int l, int r, int ll, int rr) {
if(ll > r || l > rr)
return 0;
if(l >= ll && r <= rr) {
return aint[x];
}
int m = (l + r) >> 1;
int lson = x + 1, rson = x + ((m - l + 1) << 1);
return max(query(lson, l, m, ll, rr), query(rson, m + 1, r, ll, rr));
}
};
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m;
cin >> n >> m;
SegmentTree aintmax(n);
for(int i = 0, x; i < n; ++i) {
cin >> x;
aintmax.update(1, 0, n - 1, i, x);
}
for(int i = 0; i < m; ++i) {
int t, a, b;
cin >> t >> a >> b;
if(t == 0) cout << aintmax.query(1, 0, n - 1, a - 1, b - 1) << '\n';
else aintmax.update(1, 0, n - 1, a - 1, b);
}
return 0;}