#include <iostream>
#include <fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int tree[400005], array[100001];
void build(int node, int left, int right) {
if (left == right)
tree[node] = array[left];
else {
int mid = (left + right) / 2;
build(2*node, left, mid);
build(2 * node + 1, mid + 1, right);
tree[node] = std::max(tree[node * 2], tree[2 * node + 1]);
}
}
void update(int node, int left, int right, int pos, int newValue) {
if (left == right)
tree[node] = newValue;
else {
int mid = (left + right) / 2;
if (pos <= mid)
update(2 * node, left, mid, pos, newValue);
else
update(2 * node + 1, mid + 1, right, pos, newValue);
tree[node] = std::max(tree[2 * node], tree[2 * node + 1]);
}
}
int query(int node, int left, int right, int ql, int qr) {
if (ql <= left && right <= qr)
return tree[node];
else {
int mid = (right + left) / 2;
if (qr <= mid)
return query(2 * node, left, mid, ql, qr);
if (mid + 1 <= ql)
return query(2 * node, mid + 1, right, ql, qr);
}
}
int main()
{
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> array[i];
}
build(1, 1, n);
int a, b, c;
for (int i = 1; i <= m; i++) {
fin >> a >> b >> c;
if (a == 0) {
fout << query(1, 1, n, b, c) << '\n';
}
else
update(1, 1, n, b, c);
}
}