#include<bits/stdc++.h>
using namespace std;
#define MAXN 500001
int maxarb[MAXN];
int start, finish, val, poz, maxim;
void update(int nod, int st, int dr){
int mij;
if(st==dr){
maxarb[nod]=val;
return;
}
mij=(st+dr)/2;
if(poz<=mij)
update(2*nod, st, mij);
else
update(2*nod+1, mij+1, dr);
maxarb[nod]=max(maxarb[2*nod], maxarb[2*nod+1]);
}
void querry(int nod, int st, int dr){
int mij;
if(start<=st && dr<=finish){
maxim=max(maxim, maxarb[nod]);
return;
}
mij=(st+dr)/2;
if(start<=mij) querry(2*nod, st, mij);
if(mij<finish) querry(2*nod+1, mij+1, dr);
}
int main(){
FILE*fin=fopen("arbint.in", "r");
FILE*fout=fopen("arbint.out", "w");
int n, m, i, x, a, b;
fscanf(fin, "%d%d", &n, &m);
for(i=1; i<=n; i++){
fscanf(fin, "%d", &x);
poz=i;
val=x;
update(1, 1, n);
}
for(i=1; i<=m; i++){
fscanf(fin, "%d%d%d", &x, &a, &b);
if(x==0){
maxim=-1;
start=a; finish=b;
querry(1, 1, n);
fprintf(fout, "%d\n", maxim);
}
else{
poz=a; val=b;
update(1, 1, n);
}
}
return 0;
}