#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, q, a[100005], t[400005];
void build(int node, int l, int r) {
if(l == r) {
t[node] = a[l];
}
else {
int mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
// t[node] = t[node * 2] + t[node * 2 + 1];
t[node] = max(t[node * 2], t[node * 2 + 1]);
}
}
void update(int node, int l, int r, int pos, int x) {
if(l == r) {
t[node] = x;
}
else {
int mid = (l + r) / 2;
if(mid >= pos) {
update(node * 2, l, mid, pos, x);
}
else {
update(node * 2 + 1, mid + 1, r, pos, x);
}
// t[node] = t[node * 2] + t[node * 2 + 1];
t[node] = max(t[node * 2], t[node * 2 + 1]);
}
}
int query(int node, int l, int r, int st, int dr) {
if(st <= l && r <= dr) {
return t[node];
}
else {
int mid = (l + r) / 2, ans = 0;
if(mid >= st) {
ans = max(ans, query(node * 2, l, mid, st, dr));
}
if(mid + 1 <= dr) {
ans = max(ans, query(node * 2 + 1, mid + 1, r, st, dr));
}
return ans;
}
}
int main() {
in >> n >> q;
for(int i = 1; i <= n; i++) {
in >> a[i];
}
build(1, 1, n);
// for(int i = 1; i <= 9; i++) {
// out << t[i] << '\n';
// }
while(q--) {
int op, st, dr; in >> op >> st >> dr;
if(op == 0) {
out << query(1, 1, n, st, dr) << '\n';
}
else {
update(1, 1, n, st, dr);
}
// for(int i = 1; i <= n; i++) {
// out << query(1, 1, n, i, i) << ' ';
// }
// out << '\n';
}
return 0;
}