#include <cstdio>
#include <algorithm>
using namespace std;
const int kMaxN = 100005;
const int kMaxIT = 4*kMaxN;
int N, NQ, Value[kMaxN], IT[kMaxIT];
void Build(int K, int L, int R) {
int Mid = (L+R)/2;
if (L == R) {
IT[K] = Value[Mid];
return;
}
Build(2*K, L, Mid), Build(2*K+1, Mid+1, R);
IT[K] = max(IT[2*K], IT[2*K+1]);
}
void Update(int K, int L, int R, int P, int V) {
int Mid = (L+R)/2;
if (L == R) {
IT[K] = V;
return;
}
if (P <= Mid)
Update(2*K, L, Mid, P, V);
else
Update(2*K+1, Mid+1, R, P, V);
IT[K] = max(IT[2*K], IT[2*K+1]);
}
int Query(int K, int L, int R, int QL, int QR) {
int Mid = (L+R)/2;
if (QL <= L && R <= QR)
return IT[K];
int QMax = 0;
if (QL <= Mid)
QMax = max(QMax, Query(2*K, L, Mid, QL, QR));
if (QR > Mid)
QMax = max(QMax, Query(2*K+1, Mid+1, R, QL, QR));
return QMax;
}
void Initialize() {
scanf("%d %d", &N, &NQ);
for (int i = 1; i <= N; ++i)
scanf("%d", &Value[i]);
Build(1, 1, N);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
Initialize();
for (; NQ; --NQ) {
int Type, X, Y;
scanf("%d %d %d", &Type, &X, &Y);
if (Type == 0)
printf("%d\n", Query(1, 1, N, X, Y));
if (Type == 1)
Update(1, 1, N, X, Y);
}
return 0;
}