#include <cstdio>
#include <algorithm>
using namespace std;
int N, M, task, A, B;
int segmentTree[1 << 18], 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", &value);
position = i;
Update(0, 0, N-1);
}
for(int i = 0; i < M; i++){
scanf("%d %d %d", &task, &A, &B);
if(task == 0){
maxim = -1;
start = A - 1, finish = B - 1;
Query(0, 0, N-1);
printf("%d\n", maxim);
}else{
position = A - 1, value = B;
Update(0, 0, N-1);
}
}
return 0;
}