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