#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int lim=1e5;
int tree[4*lim+3],v[lim];
void build(int nod,int l,int r)
{
if(l>r) return;
if(l==r) {tree[nod]=v[l];return;}
int med=(l+r)/2;
build(2*nod,l,med);
build(2*nod+1,med+1,r);
tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
void update(int nod,int l,int r,int poz,int val)
{
if(l>r) return;
if(l==r) {tree[nod]=val;return;}
int med=(l+r)/2;
if(poz<=med) update(2*nod,l,med,poz,val);
else update(2*nod+1,med+1,r,poz,val);
tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
int query(int nod,int l,int r,int x,int y)
{
if(l>r) return -2e9;
if(x<=l and r<=y) return tree[nod];
int med=(l+r)/2;
int ans1=-2e9,ans2=-2e9;
if(x<=med)
ans1=query(2*nod,l,med,x,y);
if(y>med)
ans2=query(2*nod+1,med+1,r,x,y);
return max(ans1,ans2);
}
int main()
{
int n,m,tip,x,y;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>v[i];
build(1,1,n);
while(m--)
{
cin>>tip>>x>>y;
if(tip) update(1,1,n,x,y);
else cout<<query(1,1,n,x,y)<<'\n';
}
return 0;
}