#include <iostream>
using namespace std;
const int INF = 1e9;
const int N = 1e5;
int v[4 * N];
int update(int node, int left, int right, int pos, int val) {
if (left > right)
return -INF;
if (left == right) {
v[node] = val;
return v[node];
}
int mid = (left + right) / 2;
int leftNode = node * 2, rightNode = node * 2 + 1;
if (pos <= mid)
update(leftNode, left, mid, pos, val);
else
update(rightNode, mid + 1, right, pos, val);
v[node] = max(v[leftNode], v[rightNode]);
return v[node];
}
int query(int node, int left, int right, int lq, int rq) {
if (right < lq || rq < left)
return -INF;
if (lq <= left && right <= rq)
return v[node];
int mid = (left + right) / 2;
int leftNode = node * 2, rightNode = node * 2 + 1;
int ans = -INF;
if (lq <= mid)
ans = max(ans, query(leftNode, left, mid, lq, rq));
if (mid < rq)
ans = max(ans, query(rightNode, mid + 1, right, lq, rq));
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
update(1, 1, n, i, x);
}
for (int i = 1; i <= m; i++) {
int op, a, b;
cin >> op >> a >> b;
if (op == 0)
cout << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, a, b);
}
return 0;
}