#include <fstream>
using namespace std;
const int N_MAX = 100000;
const int INF = 1e9;
int N, M;
int v[N_MAX + 5];
int a[4 * N_MAX + 5];
void build(int node, int l, int r) {
if (l == r) {
a[node] = v[l];
return;
}
int m = (l + r) >> 1;
int leftSon = node << 1, rightSon = leftSon | 1;
build(leftSon, l, m);
build(rightSon, m + 1, r);
a[node] = max(a[leftSon], a[rightSon]);
}
void update(int node, int l, int r, int pos, int val) {
if (l == r) {
a[node] = val;
return;
}
int m = (l + r) >> 1;
int leftSon = node << 1, rightSon = leftSon | 1;
if (pos <= m) {
update(leftSon, l, m, pos, val);
} else {
update(rightSon, m + 1, r, pos, val);
}
a[node] = max(a[leftSon], a[rightSon]);
}
int query(int node, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) {
return a[node];
}
int m = (l + r) >> 1;
int leftSon = node << 1, rightSon = leftSon | 1;
int ans = -INF;
if (ql <= m) {
ans = max(ans, query(leftSon, l, m, ql, qr));
}
if (qr > m) {
ans = max(ans, query(rightSon, m + 1, r, ql, qr));
}
return ans;
}
int main() {
ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin >> N >> M;
for (int i = 1; i <= N; ++i) {
fin >> v[i];
}
build(1, 1, N);
while (M--) {
int q, x, y;
fin >> q >> x >> y;
if (q == 0) {
fout << query(1, 1, N, x, y) << "\n";
} else {
update(1, 1, N, x, y);
}
}
return 0;
}