#include<fstream>
using namespace std;
const int MAX = 100010;
int N, M;
int aInt[MAX << 2];
#define leftSon (nod << 1)
#define rightSon ((nod << 1) | 1)
void Update(int nod, int L, int R, int poz, int el) {
if(L == R) {
aInt[nod] = el;
return;
} int M = (L + R) >> 1;
if(poz <= M)
Update(leftSon, L, M, poz, el);
else
Update(rightSon, M + 1, R, poz, el);
aInt[nod] = max(aInt[leftSon], aInt[rightSon]);
}
int Query(int nod, int L, int R, int Left, int Right) {
if(Left <= L && R <= Right) {
return aInt[nod];
} int M = (L + R) >> 1;
int Ans = 0;
if(Left <= M)
Ans = max(Ans, Query(leftSon, L, M, Left, Right));
if(M < Right)
Ans = max(Ans, Query(rightSon, M + 1, R, Left, Right));
return Ans;
}
int main() {
ifstream in("arbint.in"); ofstream out("arbint.out");
in >> N >> M;
for(int i = 1, A; i <= N; i++) {
in >> A;
Update(1, 1, N, i, A);
}
for(int i = 1, op, A, B; i <= M; i++) {
in >> op >> A >> B;
if(!op)
out << Query(1, 1, N, A, B) << "\n";
else
Update(1, 1, N, A, B);
}
}