#include <bits/stdc++.h>
using namespace std;
int N,M,v[100005],a[200005],n=1,t;
void update(int p, int x)
{
int k;
a[p+n-1]=x;
p=p+n-1;
while(k>0)
{
if(p%2==1) p--;
k=p/2;
a[k]=max(a[p],a[p+1]);
p=k;
}
}
int query(int p,int x, int y, int st, int dr)
{
int m=(st+dr)/2;
if(st==x && dr==y) {return a[p];}
if(y<=m) return query(2*p,x,y,st,m);
if(x>m) return query(2*p+1,x,y,m+1,dr);
return max( query(2*p,x,m,st,m), query(2*p+1,m+1,y,m+1,dr) );
}
int main()
{
int i,x,y;
ifstream fin("arbint.in");
fin>>N>>M;
for(i=1;i<=N;i++)
fin>>v[i];
while(n<N)
n*=2;
for(i=n;i<n+N;i++)
a[i]=v[i-n+1];
for(i=n+N+1;i<2*n;i++)
a[i]=0;
for(i=n-1;i>0;i--)
a[i]=max(a[2*i],a[2*i+1]);
ofstream fout("arbint.out");
for(i=1;i<=M;i++)
{
fin>>t>>x>>y;
if(t==0)
fout<<query(1,x,y,1,n)<<"\n";
else update(x,y);
}
fin.close();
fout.close();
return 0;
}