#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
class ArbInt {
public:
int *tree;
ArbInt(int n) {
tree = new int[4 * n]();
}
void Update(int nod, int st, int dr, int pos, int val) {
if (st == dr) {
tree[nod] = val;
return;
}
int mid = (st + dr) / 2;
if (pos <= mid) {
Update(nod * 2, st, mid, pos, val);
} else {
Update(nod * 2 + 1, mid + 1, dr, pos, val);
}
tree[nod] = max(tree[nod * 2], tree[nod * 2 + 1]);
}
int Query(int nod, int st, int dr, int a, int b) {
if (dr < a || st > b) return 0;
if (st >= a && dr <= b) return tree[nod];
int mid = (st + dr) / 2;
int max_left = 0, max_right = 0;
if (st <= mid) max_left = Query(nod * 2, st, mid, a, b);
if (dr > mid) max_right = Query(nod * 2 + 1, mid + 1, dr, a, b);
return max(max_left, max_right);
}
};
int n, m;
ArbInt *T;
int main()
{
in >> n >> m;
T = new ArbInt(n);
for (int i = 1, x; i <= n; ++i) {
in >> x;
T->Update(1, 1, n, i, x);
}
for (int i = 1, o, a, b; i <= m; ++i) {
in >> o >> a >> b;
if (o == 0) {
out << T->Query(1, 1, n, a, b) << "\n";
} else {
T->Update(1, 1, n, a, b);
}
}
return 0;
}