#include<bits/stdc++.h>
#define Nmax 100005
using namespace std;
int N, M, Arb[Nmax * 4], maxim = 0;
void Uptade(int Nod, int st, int dr, int X, int ind)
{
if(st == dr) {
Arb[Nod] = X;
return;
}
int mid = (st + dr) / 2;
if(ind <= mid)
Uptade(2*Nod, st, mid, X, ind);
else
Uptade(2*Nod + 1, mid + 1, dr, X, ind);
Arb[Nod] = max(Arb[Nod * 2], Arb[Nod * 2 + 1]);
}
void Query(int Nod, int st, int dr, int X, int Y)
{
if(X <= st && dr <= Y) {
maxim = max(maxim, Arb[Nod]);
return ;
}
int mid = (st + dr) / 2;
if(X <= mid)
Query(2 * Nod, st, mid, X, Y);
if(Y > mid)
Query(2 * Nod + 1, mid + 1, dr, X, Y);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++ i) {
int X;
scanf("%d", &X);
Uptade(1, 1, N, X, i);
}
for( ; M; -- M) {
int A, B, tip;
scanf("%d %d %d", &tip, &A, &B);
if(tip)
Uptade(1, 1, N, B, A);
else
maxim = 0,
Query(1, 1, N, A, B),
printf("%d\n", maxim);
}
return 0;
}