// https://infoarena.ro/problema/arbint
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100000
int v[NMAX + 1], tree[4 * NMAX + 1];
void build(int node, int left, int right) {
if (left == right) {
tree[node] = v[left];
return;
}
int mid = left + (right - left) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void update(int node, int left, int right, int pos, int val) {
if (left == right) {
tree[node] = val;
v[pos] = val;
return;
}
int mid = left + (right - left) / 2;
if (pos <= mid) {
update(2 * node, left, mid, pos, val);
} else {
update(2 * node + 1, mid + 1, right, pos, val);
}
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
int query(int node, int left, int right, int x, int y) {
if (x <= left && right <= y) {
return tree[node];
}
int mid = left + (right - left) / 2, ans = 0;
if (x <= mid) {
ans = max(ans, query(2 * node, left, mid, x, y));
}
if (mid < y) {
ans = max(ans, query(2 * node + 1, mid + 1, right, x, y));
}
return ans;
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
build(1, 1, n);
for (int i = 0; i < m; i++) {
int q, a, b;
cin >> q >> a >> b;
if (q == 0) {
cout << query(1, 1, n, a, b) << endl;
cout.flush();
} else if (q == 1) {
update(1, 1, n, a, b);
}
}
return 0;
}