#include <fstream>
#include <algorithm>
using namespace std;
int arb[400005];
inline void u(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 q(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 q(nod*2,x,y,st,m);
else
if(x>m)
return q(nod*2+1,x,y,m+1,dr);
else
return max(q(nod*2,x,m,st,m), q(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<<q(1,x,y,1,p)<<"\n";
else
u(p-1+x,y);
}
return 0;
}