#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int n,m;
int tree[400100];
ifstream in("arbint.in");
ofstream out("arbint.out");
void update_val(int lo, int hi, int pos, int val, int node) {
if((lo == hi) && (hi == pos)) {
tree[node] = val;
return;
}
int mid = (lo + hi)/2;
if(pos <= mid)
update_val(lo, mid, pos, val, node * 2);
else
update_val(mid + 1, hi, pos, val, node*2 + 1);
tree[node] = max(tree[node*2], tree[node*2 + 1]);
}
int query(int lo, int hi, int a, int b, int node) {
if((a <= lo) && (hi <= b))
return tree[node];
int mid = (lo + hi)/2;
int r = -1;
if(a <= mid) {
r = max(r, query(lo, mid, a, b, node*2));
}
if(mid < b) {
r = max(r, query(mid + 1, hi, a, b, node*2 + 1));
}
return r;
}
int main() {
in >> n >> m;
for(int i = 0; i < n; ++i) {
int x; in >> x;
update_val(1, n, i + 1, x, 1);
}
for(int i = 0; i < m; ++i) {
int x,a,b;
in >> x >> a >> b;
if(x == 0) {
out << query(1, n, a, b, 1) << '\n';
}
else {
update_val(1, n, a, b, 1);
}
}
return 0;
}