#include <fstream>
#include <algorithm>
using namespace std;
int arb[400005];
inline void Update(int p,int x)
{
int k,y;
arb[p]=x;
while(p>1)
{
k=p/2;
y=max(arb[2*k], arb[2*k+1]);
if(y!=arb[k])
arb[k]=y;
else
return ;
p=k;
}
}
inline int Query(int nod, int x,int y,int st,int dr)
{
int m;
if(x==st && y==dr)
return arb[nod];
m=(st+dr)/2;
if(y<=m)
return Query(nod*2,x,y,st,m);
else
if(x>m)
return Query(nod*2+1,x,y,m+1,dr);
else
return max(Query(nod*2,x,m,st,m), Query(nod*2+1,m+1,y,m+1,dr));
}
int main()
{
int tip,x,y,m,n;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin>>n>>m;
int p=1;
while(p<n)
{
p=p*2;
}
for(int i=p;i<p+n;i++)
cin>>arb[i];
for(int i=p-1;i>0;i--)
arb[i]=max(arb[i*2], arb[i*2+1]);
while(m--)
{
cin>>tip>>x>>y;
if(tip==0)
cout<<Query(1,x,y,1,n)<<"\n";
else
Update(n-1+x,y);
}
return 0;
}