#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m;
int v[100005],aint[400005];
int query(int st, int dr, int a, int b, int node)
{
if(st==a && dr==b)
return aint[node];
int med=(st+dr)/2;
int maxst=0,maxdr=0;
if(a<=med) maxst=query(st,med,a,min(med,b),node*2);
if(b>med) maxdr=query(med+1,dr,max(med+1,a),b,node*2+1);
return max(maxst,maxdr);
}
void update(int st, int dr, int node, int poz, int val)
{
if(st==dr)
{
aint[node]=v[poz]=val;
return;
}
int med=(st+dr)/2;
if(poz<=med) update(st,med,node*2,poz,val);
else update(med+1,dr,node*2+1,poz,val);
aint[node]=max(aint[node*2],aint[node*2+1]);
}
int main()
{
in>>n>>m;
for(int i=1; i<=n; i++)
{
in>>v[i];
update(1,n,1,i,v[i]);
}
int t,a,b;
while(m--)
{
in>>t>>a>>b;
if(t==0) out<<query(1,n,a,b,1)<<'\n';
else update(1,n,1,a,b);
}
return 0;
}