#include <fstream>
#include <vector>
using namespace std;
#define dim 100001
int N, M;
vector<int> a(3 * dim);
void Update(int nod, int l, int r, int Pos, int Val) {
int m;
if (l == r) {
a[nod] = Val;
return;
}
m = (l + r) / 2;
if (Pos <= m)
Update(2 * nod, l, m, Pos, Val);
else
Update(2 * nod + 1, m + 1, r, Pos, Val);
a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}
int Query(int nod, int l, int r, int start, int finish) {
int m;
if (start <= l && r <= finish) // Maximul intre [start, finish] este în a[nod].
return a[nod];
m = (l + r) / 2;
int maxim = -1;
if (start <= m)
maxim = max(maxim, Query(2 * nod, l, m, start, finish));
if (m < finish)
maxim = max(maxim, Query(2 * nod + 1, m + 1, r, start, finish));
return maxim;
}
int main() {
ifstream fin("datorii.in");
ofstream fout("datorii.out");
fin >> N >> M;
for (int i = 1; i <= N; i++) {
int X;
fin >> X;
Update(1, 1, N, i, X);
}
for (int i = 1; i <= M; i++) {
int X, A, B;
fin >> X >> A >> B;
if (X == 0) {
fout << Query(1, 1, N, A, B) << '\n';
} else {
Update(1, 1, N, A, B);
}
}
fin.close();
fout.close();
return 0;
}