#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
vector<int> arb;
vector<int> v;
void build(int i, int l, int r) {
if (l == r)
arb[i] = v[l];
else {
int mid = (l + r) / 2;
build(i * 2, l, mid);
build(i * 2 + 1, mid + 1, r);
arb[i] = max(arb[i * 2], arb[i * 2 + 1]);
}
}
void change(int i, int l, int r, int idx, int val) {
if (l == r) {
v[idx] = val;
arb[i] = val;
} else {
int mid = (l + r) / 2;
if (idx <= mid)
change(i * 2, l, mid, idx, val);
else
change(i * 2 + 1, mid + 1, r, idx, val);
arb[i] = max(arb[i * 2], arb[i * 2 + 1]);
}
}
int query(int i, int l, int r, int ql, int qr) {
if (qr < l || ql > r)
return -1;
if (ql <= l && qr >= r)
return arb[i];
int mid = (l + r) / 2;
return max(query(i * 2, l, mid, ql, qr), query(i * 2 + 1, mid + 1, r, ql, qr));
}
int main() {
int n, m;
f >> n >> m;
v.resize(n + 1);
arb.resize(4 * n);
for (int i = 1; i <= n; i++)
f >> v[i];
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int choice, a, b;
f >> choice >> a >> b;
switch (choice) {
case 0:
g << query(1, 1, n, a, b) << endl;
break;
case 1:
change(1, 1, n, a, b);
break;
}
}
f.close();
g.close();
return 0;
}