#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
void update(int pos_upd,int val,vector<int> &aint,int pos_aint,int st,int dr){
if(st==dr){
aint[pos_aint]=val;
}
else{
int mij=(st+dr)>>1;
if(mij>=pos_upd)
update(pos_upd,val,aint,2*pos_aint,st,mij);
else
update(pos_upd,val,aint,2*pos_aint+1,mij+1,dr);
aint[pos_aint]=max(aint[pos_aint*2],aint[pos_aint*2+1]);
}
}
//11 22
int query(int st_q,int dr_q,vector<int>& aint,int pos_aint,int st,int dr){
// cout << pos_aint << ": "<< st << " " << dr <<"\n";
if(st_q<=st and dr_q>=dr){
return aint[pos_aint];
}
int mij=(st+dr)>>1;
if( !( dr_q < st or dr < st_q ) )
{
if( st==dr )
return aint[pos_aint];
int ans=-1;
if( st_q<=mij )
ans=query(st_q,dr_q,aint,pos_aint*2,st,mij);
if( mij<dr_q )
ans=max(ans,query(st_q,dr_q,aint,pos_aint*2+1,mij+1,dr));
return ans;
}
return -INT_MAX;
}
int main()
{
int N,M;
f>>N>>M;
vector <int> v(N+11), aint(4*N+11);
for(int i=1;i<=N;i++){
f>>v[i];
update(i,v[i],aint,1,1,N);
}
// for(auto x:aint)
// cout << x << " ";
// cout << query(1,1,aint,1,1,N);
//
// return 0;
for(int i=1;i<=M;i++){
int tip,a,b;
f>>tip>>a>>b;
if(tip==1){
update(a,b,aint,1,1,N);
}
else if(tip==0){
int aux=query(a,b,aint,1,1,N);
g<<aux<<'\n';
}
}
return 0;
}