#include <cstdio>
#include <algorithm>
using namespace std;
int N, M, X, A, B;
int segmentTree[562144], value;
int start, finish, position, maxim;
void Update(int node, int low, int high){
if(low == high){
segmentTree[node] = value;
return;
}
int middle = low + (high - low) / 2;
if(position <= middle) Update(2 * node + 1, low, middle);
else Update(2 * node + 2,middle + 1, high);
segmentTree[node] = max(segmentTree[2 * node + 1], segmentTree[2 * node + 2]);
}
void Query(int node, int low, int high){
if(start <= low && high <= finish){
if(maxim < segmentTree[node]) maxim = segmentTree[node];
return;
}
int middle = low + (high - low) / 2;
if(start <= middle) Query(2 * node + 1, low, middle);
if(middle < finish) Query(2 * node + 2, middle + 1 , high);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d", &N, &M);
for(int i=0; i<N; i++){
scanf("%d", &X);
position = i, value = X;
Update(0,0,N-1);
}
for(int i=0; i<M; i++){
scanf("%d %d %d", &X, &A, &B);
if(X == 0){
maxim = -1;
start = A - 1 , finish = B - 1 ;
Query(0,0,N-1);
printf("%d\n", maxim);
}else{
position = A - 1, value = B - 1;
Update(0,0,N-1);
}
}
return 0;
}