#include <cstdio>
#include <fstream>
#include <assert.h>
using namespace std;
#define dim 100001
#define maxim(a,b) (a>b?a:b)
int n, m;
int maxArb[4*dim+66];
int start, finish, val, Pos, maxim;
void Update(int nod, int left, int right){
if ( left == right ){maxArb[nod] = val;return;}
int div = (left+right)/2;
if ( Pos <= div ) Update(2*nod,left,div);
else Update(2*nod+1,div+1,right);
maxArb[nod] = maxim( maxArb[2*nod], maxArb[2*nod+1] );
}
void Query(int nod, int left, int right){
if(start<=left && right<=finish){
if (maxim<maxArb[nod])maxim=maxArb[nod];
return;
}
int div = (left+right)/2;
if(start<=div)Query(2*nod,left,div);
if(div<finish)Query(2*nod+1,div+1,right);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int x, A, B;
scanf("%d%d", &n, &m);
for (int i=1; i<=n;i++){
scanf("%d", &x);
Pos = i, val = x;
Update(1,1,n);
}
for ( int i = 1; i <= m; i++ ){
scanf("%d%d%d", &x, &A, &B);
if ( x == 0 ){
maxim = -1;
start = A, finish = B;
Query(1,1,n);
printf("%d\n", maxim);
}else{
Pos = A, val = B;
Update(1,1,n);
}
}
}