#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int MAXN = 1e5;
int aint[MAXN << 2];
int query(int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b) return aint[nod];
int mid = (st + dr) / 2;
int le = 0, ri = 0;
if (mid >= a) le = query(nod << 1, st, mid, a, b);
if (mid < b) ri = query((nod << 1) + 1, mid + 1, dr, a, b);
return max(le, ri);
}
void update(int nod, int st, int dr, int a, int b) {
if (st == dr) {
aint[nod] = b;
}
else {
int mid = (st + dr) / 2;
if (mid >= a) update(nod << 1, st, mid, a, b);
else update((nod << 1) + 1, mid + 1, dr, a, b);
aint[nod] = max(aint[nod << 1], aint[(nod << 1) + 1]);
}
}
int m, n;
int main() {
in >> n >> m;
int nr;
for (int i = 1; i <= n; ++ i) {
in >> nr;
update(1, 1, n, i, nr);
}
int q, a, b;
while (m --) {
in >> q >> a >> b;
if (q) update(1, 1, n, a, b);
else out << query(1, 1, n, a, b) << '\n';
}
return 0;
}