#include <iostream>
using namespace std;
int aint[4 * 100005];
void update(int node, int st, int dr, int pos, int val) {
if(st == dr) {
aint[node] = val;
return;
}
int mid = (st + dr) / 2;
if(pos <= mid) {
update(node * 2, st, mid, pos, val);
}
else {
update(node * 2 + 1, mid + 1, dr, pos, val);
}
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
// cout << node << '\n';
}
int query(int node, int st, int dr, int a, int b) {
if(a <= st && dr <= b) {
return aint[node];
}
int mid = (st + dr) / 2;
int ml = 0, mr = 0;
if(a <= mid) {
ml = query(node * 2, st, mid, a, b);
}
if(mid + 1 <= b) {
mr = query(node * 2 + 1, mid + 1, dr, a, b);
}
return max(mr, ml);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int q, n; cin >> n >> q;
for(int i = 1; i <= n; i ++) {
int x; cin >> x;
update(1, 1, n, i, x);
// cout << query(1, 1, n, i, i) << ' ';
}
while(q --) {
int c, a, b; cin >> c >> a >> b;
if(c == 0) {
cout << query(1, 1, n, a, b) << '\n';
} else {
update(1, 1, n, a, b);
}
}
}