#include <fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int n, m;
int aint[400005], a[100005];
void buildAint(int k, int st, int dr) {
if (st == dr) {
aint[k] = a[st];
}
else {
int mid = (st + dr) / 2;
buildAint(2 * k, st, mid);
buildAint(2 * k + 1, mid + 1, dr);
aint[k] = std::max(aint[2 * k], aint[2 * k + 1]);
}
}
void update(int k, int st, int dr, int poz, int val) {
if (st == dr) {
aint[k] = val;
}
else {
int mid = (st + dr) / 2;
if (poz <= mid) {
update(2 * k, st, mid, poz, val);
}
else {
update(2 * k + 1, mid + 1, dr, poz, val);
}
aint[k] = std::max(aint[2 * k], aint[2 * k + 1]);
}
}
int query(int k, int st, int dr, int x, int y) {
if (x <= st && dr <= y) {
return aint[k];
}
int mid = (st + dr) / 2;
if (y <= mid) {
return query(2 * k, st, mid, x, y);
}
else if (mid < x) {
return query(2 * k + 1, mid + 1, st, x, y);
}
return std::max(query(2 * k, st, mid, x, y), query(2 * k + 1, mid + 1, dr, x, y));
}
int main() {
int q, x, y;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> a[i];
}
buildAint(1, 1, n);
for (int i = 1; i <= m; i++) {
fin >> q >> x >> y;
if (q == 0) {
fout << query(1, 1, n, x, y) << "\n";
}
else {
update(1, 1, n, x, y);
}
}
}