#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
vector<int> aint;
void update(vector<int> &aint, int st, int dr, int node, int id, int val) {
if (st == dr) {
aint[node] = val;
return;
}
int mid = (st + dr) / 2;
if (id <= mid) {
update(aint, st, mid, 2 * node, id, val);
} else {
update(aint, mid + 1, dr, 2 * node + 1, id , val);
}
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
int query(vector<int> &aint, int st, int dr, int node, int l, int r) {
if (l <= st && dr <= r) {
return aint[node];
}
int mid = (st + dr) / 2;
int left = 0, right = 0;
if (l <= mid) {
left = query(aint, st, mid, 2 * node, l, r);
}
if (r > mid) {
right = query(aint, mid + 1, dr, 2 * node + 1, l, r);
}
return max(left, right);
}
int main() {
in >> n >> m;
aint = vector<int>(4 * n + 1, 0);
for (int i = 1, x; i <= n; i++) {
in >> x;
update(aint, 1, n, 1, i, x);
}
for (int t, x, y; m--; ) {
in >> t >> x >> y;
if (t == 0) {
out << query(aint, 1, n, 1, x, y) << '\n';
} else {
update(aint, 1, n, 1, x, y);
}
}
return 0;
}