#include <bits/stdc++.h>
using namespace std;
int ST[500005];
void update(int node,int l, int r, int poz, int val)
{
if(l==r)
{
ST[node]=val;
return;
}
int mid=(l+r)/2;
if(poz<=mid)
update(node*2,l,mid,poz,val);
else
update(node*2+1,mid+1,r,poz,val);
ST[node]=max(ST[node*2],ST[node*2+1]);
}
int query(int node, int l, int r, int ql, int qr)
{
int smax=0;
if(ql<=l&&r<=qr)
return ST[node];
int mid=(l+r)/2;
if(ql<=mid)
{
int s=query(node*2,l,mid,ql,qr);
smax=max(smax,s);
}
if(qr>=mid+1)
{
int s=query(node*2+1,mid+1,r,ql,qr);
smax=max(smax,s);
}
return smax;
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
int a;
cin>>a;
update(1,1,n,i,a);
}
for(int i=1;i<=m;++i)
{
int op,x,y;
cin>>op>>x>>y;
if(op==0)
cout<<query(1,1,n,x,y)<<'\n';
else
update(1,1,n,x,y);
}
}