#include<stdio.h>
using namespace std;
int maxarb[300000];
int n, m, start, finish, x, maxim, a, b, pos;
inline int max(int a, int b){
return a>b?a:b;
}
void update(int nod, int left, int right){
if(left==right){
maxarb[nod]=x;
return;
}
int m=(left+right)/2;
if(pos<=m) update(2*nod, left, m);
else update(2*nod+1, m+1, right);
maxarb[nod]=max(maxarb[2*nod], maxarb[2*nod+1]);
}
void query(int nod, int left, int right){
if(start<=left&&right<=finish){
maxim=(max(maxim, maxarb[nod]));
return;
}
int m=(left+right)/2;
if(start<=m) query(2*nod, left, m);
if(finish>m) query(2*nod+1, m+1, right);
}
int main(){
int i;
freopen("arbint.in", "rt",stdin);
freopen("arbint.out", "wt",stdout);
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++){
maxim=-1;
scanf("%d", &x);
pos=i;
update(1,1,n);
}
for(i=0;i<m;i++){
scanf("%d", &x);
scanf("%d%d", &a, &b);
if(x==0){
maxim=-1;
start=a, finish=b;
query(1,1,n);
printf("%d\n", maxim);
}
else {
pos=a, x=b;
update(1,1,n);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}