#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int MAXN = 1e5;
const int MAXM = 1e5;
int mx[MAXN << 2];
int n, m;
void update(int node, int le, int ri, int poz, int val) {
if (le == ri) mx[node] = val;
else {
int mid = (le + ri) >> 1;
if (poz <= mid) update(node << 1, le, mid, poz, val);
else update((node << 1) + 1, mid + 1, ri, poz, val);
mx[node] = max(mx[node << 1], mx[(node << 1) + 1]);
}
}
int query(int node, int le, int ri, int a, int b) {
if (a <= le && ri <= b) return mx[node];
int mid = (le + ri) / 2;
int ri_son = 0, le_son = 0;
if (mid >= a) le_son = query(node * 2, le, mid, a, b);
if (mid < b) ri_son = query((node * 2) + 1, mid + 1, ri, a, b);
return max(le_son, ri_son);
}
int main()
{
in >> n >> m;
int nr;
for (int i = 1; i <= n; ++ i) {
in >> nr;
update(1, 1, n, i, nr);
}
int t, a, b;
for (int i = 1; i <= m; ++ i) {
in >> t >> a >> b;
if (t) update(1, 1, n, a, b);
else out << query(1, 1, n, a, b) << '\n';
}
return 0;
}