#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_NODES 500000
#define inFile "arbint.in"
#define outFile "arbint.out"
int qANS;
class SegmentTree {
private:
int sTree[MAX_NODES];
public:
SegmentTree();
void Update(int X, int L, int R, int Pos, int Val);
void Query(int X, int L, int R, int i, int j);
};
SegmentTree :: SegmentTree() {
memset(sTree, 0, sizeof(sTree));
}
void SegmentTree :: Update(int X, int L, int R, int Pos, int Val) {
if(L == R) {
sTree[X] = Val;
return;
}
int Mid = (L+R)>>1;
if(Pos <= Mid)
Update(2*X, L, Mid, Pos, Val);
else
Update(2*X+1, Mid+1, R, Pos, Val);
sTree[X] = max(sTree[2*X], sTree[2*X+1]);
}
void SegmentTree :: Query(int X, int L, int R, int i, int j) {
if(i <= L && R <= j) {
qANS = max(qANS, sTree[X]);
return;
}
int Mid = (L+R)>>1;
if(i <= Mid)
Query(2*X, L, Mid, i, j);
if(j > Mid)
Query(2*X+1, Mid+1, R, i, j);
}
int main() {
freopen(inFile, "r", stdin);
freopen(outFile, "w", stdout);
int N, M, i, A, B, op;
SegmentTree Tree;
scanf("%d %d", &N, &M);
for(i = 1; i <= N; i++) {
scanf("%d", &A);
Tree.Update(1, 1, N, i, A);
}
for(i = 1; i <= M; i++) {
scanf("%d %d %d", &op, &A, &B);
if(op == 0) {
qANS = 0;
Tree.Query(1, 1, N, A, B);
printf("%d\n", qANS);
}
else
Tree.Update(1, 1, N, A, B);
}
return 0;
}