#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[400005];
int query(int nod,int qst,int qdr, int st, int dr){
if(qst<=st && dr<=qdr){ //este intervalul selectat inclus în intervalul de query?
return v[nod];
}else if(qst>dr || qdr<st){ //daca intervalul selectat nu se intersecteaza cu intervalul de query:
return -1;
}else{
int mid = (st+dr)/2; //dacă se intersecteaza, dar nu e inclus
return max(query(2*nod,qst,qdr,st,mid),query(2*nod+1,qst,qdr,mid+1,dr));
}
}
void update(int val,int nod, int poz, int st,int dr){
if(st == dr){
v[nod] = val;
return;
}
int mid = (st+dr)/2;
if(poz<= mid){
update(val,2*nod,poz,st,mid);
}else{
update(val,2*nod+1,poz,mid+1,dr);
}
v[nod] = max(v[2*nod],v[2*nod+1]);
}
int main() {
int n,m,i,p,a,b;
fin>>n>>m;
for(i = 1; i <= n; i++){
fin>>a;
update(a,1,i,1,n);
}
for(i = 1; i <= m; i++){
fin>>p>>a>>b;
if(p == 0){ //maxim
fout<<query(1,a,b,1,n)<<'\n';
}else{
update(b,1,a,1,n);
}
}
return 0;
}