#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m;
vector<int> values;
vector<int> tree;
void read(){
in>>n>>m;
values.resize(n+1);
tree.resize(4*n+4);
for(int i=1; i<=n;i++){
in>>values[i];
}
}
void build_tree(int node, int l, int r) {
if (l == r) {
tree[node] = values[l];
return;
}
int m = (l+r)/2;
build_tree(node*2, l, m);
build_tree(node*2+1, m+1, r);
tree[node] = max(tree[node*2], tree[node*2+1]);
}
int query(int node, int l, int r, int ql, int qr) {
if (l >= ql && r <= qr) {
return tree[node];
}
int m = (l+r)/2;
int result = -1;
if (ql <= m) {
result=max(result, query(node*2, l, m, ql, qr));
}
if (qr > m) {
result = max(result, query(node*2+1, m+1, r, ql, qr));
}
return result;
}
void update(int node, int l, int r, int index, int value) {
if(l == r) {
tree[node] = value;
return;
}
int m = (l+r)/2;
if (index<=m) {
update(node*2, l, m, index, value);
} else{
update(node*2+1, m+1, r, index, value);
}
tree[node] = max(tree[node*2], tree[node*2+1]);
}
int main(){
read();
build_tree(1, 1, n);
int q, a, b;
while(m--){
in>>q>>a>>b;
if (q==0) {
out<<query(1, 1, n, a, b)<<'\n';
} else {
update(1, 1, n,a, b);
}
}
return 0;
}