#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
vector<int> segm_tree(500005);
vector<int> val(100005);
void build(int node, int left, int right) {
if (left == right) {
segm_tree[node] = val[left];
}
else {
int mij = (left + right) / 2;
build(node * 2, left, mij);
build(node * 2 + 1, mij+1, right);
segm_tree[node] = max(segm_tree[node * 2], segm_tree[node * 2 + 1]);
}
}
void update(int node, int left, int right, int pos, int new_val) {
if (left == right) {
segm_tree[node] = new_val;
}
else {
int mij = (left + right) / 2;
if (pos <= mij) {
update(node*2,left,mij,pos,new_val);
}
else {
update(node * 2+1, mij+1, right, pos, new_val);
}
segm_tree[node] = max(segm_tree[node * 2], segm_tree[node * 2 + 1]);
}
}
int query(int node, int left, int right, int left_q, int right_q) {
if (left_q <= left && right <= right_q) {
return segm_tree[node];
}
else {
int mij = (left + right) / 2;
if (right_q <= mij) {
return query(node * 2, left, mij, left_q, right_q);
}
if(mij+1<=left_q) {
return query(node * 2 + 1, mij + 1, right, left_q, right_q);
}
return max(query(node * 2, left, mij, left_q, right_q), query(node * 2 + 1, mij + 1, right, left_q, right_q));
}
}
int main() {
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> val[i];
}
build(1, 1, n);
int t,a ,b;
for (int i = 1; i <= m; i++) {
fin >> t;
if (t == 0) {
fin >> a >> b;
fout << query(1, 1, n, a, b)<<'\n';
}
else {
fin >> a >> b;
update(1, 1, n , a, b);
}
}
return 0;
}