#include <stdio.h>
#include <fstream>
#include <assert.h>
#define dim 100001
int MaxVal[4 * dim + 66], Poz, N, M, Val, start, stop, maxim;
int max(int a, int b)
{
if (a > b)
return a;
return b;
}
void Update(int nod, int left, int right);
void Query(int nod, int left, int right);
int main()
{
int i,x;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &N, &M);
assert(N <= 100000);
assert(M <= 100000);
for (i = 1; i <= N; ++i) {
scanf("%d", &x);
Poz = i, Val = x;
Update(1, 1, N);
}
int a, b;
for (i = 1; i <= M; ++i) {
scanf("%d%d%d", &x, &a, &b);
if (x!=0) {
start = a;
stop = b;
maxim = -1;
Query(1, 1, N);
printf("%d\n", maxim);
}
else {
Val = b;
Poz = a;
Update(1, 1, N);
}
}
return 0;
}
void Update(int nod, int left, int right)
{
if ( left == right )
{
MaxVal[nod] = Val;
return;
}
int div = (left+right)/2;
if ( Poz <= div ) Update(2*nod,left,div);
else Update(2*nod+1,div+1,right);
MaxVal[nod] = max( MaxVal[2*nod], MaxVal[2*nod+1] );
}
void Query(int nod, int left, int right)
{
if (start <= left && right <= stop)
{
if (maxim < MaxVal[nod])
maxim = MaxVal[nod];
return;
}
int div = (left + right) / 2;
if (start <= div) Query(2 * nod, left, div);
if (div < stop) Query(2 * nod + 1, div + 1, right);
}