#include<bits/stdc++.h>
using namespace std;
int arb[400069];
int n, val, pos, maxim, start, finish;
void update(int nod, int st, int dr){
if(st==dr){
arb[nod]=val;
return;
}
int m=(st+dr)/2;
if(pos <= m) update(2*nod, st, m); else update(2*nod+1, m+1, dr);
arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}
void query(int nod, int st, int dr){
if(start <= st && finish >= dr){
if(maxim < arb[nod]) maxim=arb[nod];
return;
}
int m=(st+dr)/2;
if(start<=m) query(2*nod, st, m);
if(m < finish) query(2*nod+1, m+1, dr);
}
int main(){
int m;
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);
pos=i;
val=x;
update(1, 1, n);
}
int x, y, k;
while(m--){
scanf("%d%d%d", &k, &x, &y);
if(k==0){
maxim=-1;
start=x;
finish=y;
query(1, 1, n);
printf("%d\n", maxim);
}else{
pos=x;
val=y;
update(1, 1, n);
}
}
return 0;
}