#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int MAX = 1e5 + 1;
int v[MAX] , aint[4*MAX] , n , q , uv , poz , op , a , b , qst , qdr;
void init( int nod , int st , int dr ){
if(st == dr) aint[nod] = v[st];
else{
int mij = (st+dr)/2;
init(nod*2,st,mij);
init(nod*2+1,mij+1,dr);
aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}
}
void update( int nod , int st , int dr ){
if(st == dr) aint[nod] = uv;
else{
int mij = (st+dr)/2;
if(poz <= mij) update(nod*2,st,mij);
else update(nod*2+1,mij+1,dr);
aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}
}
int query( int nod , int st , int dr){
if(qst<=st && dr<=qdr) return aint[nod];
else{
int mij = (st+dr)/2;
int val = -1;
if(qst <= mij) val = max(val,query(nod*2,st,mij));
if(qdr > mij) val = max(val,query(nod*2+1,mij+1,dr));
return val;
}
}
int main(){
cin >> n >> q;
for(int i = 1 ; i <= n ; i++){
cin >> v[i];
}
init(1,1,n);
while(q--){
cin >> op >> a >> b;
if(op == 1){
poz = a;
uv = b;
update(1,1,n);
}else{
qst = a;
qdr = b;
cout << query(1,1,n) << '\n';
}
}
return 0;
}