#include <fstream>
using namespace std;
void act(int nod,int b,int j,int pos,int val,int arb[])
{
if(b==j)
{
arb[nod]=val;
}
else {
int m=(b+j)/2;
if(pos<=m)
{
act(2*nod,b,m,pos,val,arb);
}
else act(2*nod+1,m+1,j,pos,val,arb);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
void v2max(int nod,int a,int b,int bal,int jobb,int arb[],int &max1)
{
if(a<=bal && jobb<=b)
{
if(max1<arb[nod])max1=arb[nod];
return;
}
int m=(bal+jobb)/2;
if(a<=m)v2max(2*nod,a,b,bal,m,arb,max1);
if(m<b)v2max(2*nod+1,a,b,m+1,jobb,arb,max1);
}
int main()
{
ifstream be("arbint.in");
ofstream ki("arbint.out");
int n,m;
be>>n>>m;
int x,y,a,b,max1;
int arb[4*n+4]={0};
for(int i=1;i<=n;i++)
{
y=i;
be>>x;
act(1,1,n,y,x,arb);
}
for(int i=1;i<=m;i++)
{
be>>x>>a>>b;
if(x==0)
{
max1=-1;
v2max(1,a,b,1,n,arb,max1);
ki<<max1<<'\n';
}
else{
act(1,1,n,a,b,arb);
}
}
return 0;
}