#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
int arr[N + 1];
int segment_tree[N * 4];
void build(int node, int left, int right) {
if (left == right) {
segment_tree[node] = arr[left];
} else {
int interval_middle = (left + right) / 2;
build(2 * node, left, interval_middle);
build(2 * node + 1, interval_middle + 1, right);
segment_tree[node] = max(segment_tree[2*node], segment_tree[2*node + 1]);
}
}
void update(int node, int left, int right, int position, int value) {
if (left == right) {
segment_tree[node] = value;
} else {
int interval_middle = (left + right) / 2;
if (position <= interval_middle) {
update(2 * node, left, interval_middle, position, value);
} else {
update(2 * node + 1, interval_middle + 1, right, position, value);
}
segment_tree[node] = max(segment_tree[2*node], segment_tree[2*node + 1]);
}
}
int query(int node, int left, int right, int query_left, int query_right) {
if (left >= query_left && right <= query_right) {
return segment_tree[node];
}
int middle = (left + right) / 2;
if (query_right <= middle) {
return query(2 * node, left, middle, query_left, query_right);
}
if (query_left >= middle+1) {
return query(2 * node + 1, middle + 1, right, query_left, query_right);
}
return max(query(2 * node, left, middle, query_left, query_right), query(2 * node + 1, middle + 1, right, query_left, query_right));
}
int main() {
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
ifstream fin("arbint.in");
int n, q;
fin >> n >> q;
for (int i = 1; i <= n; i++)
fin >> arr[i];
build(1, 1, n);
int a, b, c;
ofstream fout("arbint.out");
while (q--) {
fin >> a >> b >> c;
if (a == 0) {
fout << query(1, 1, n, b, c) << '\n';
} else {
update(1, 1, n, b, c);
}
}
return 0;
}