#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX = 100005;
int N,M,i,X,W,Poz,Val,A,B,Arb[1<<18],R;
void Update(int Node,int Left,int Right)
{
if(Left==Right) {Arb[Node]=Val; return;}
int Middle=(Left+Right)/2;
if(Poz<=Middle) Update(Node*2,Left,Middle);
else Update(Node*2+1,Middle+1,Right);
Arb[Node]=max(Arb[2*Node],Arb[2*Node+1]);
}
void Query(int Node,int Left,int Right)
{
if(Left>=A && Right<=B) {R=max(R,Arb[Node]); return;}
int Middle=(Left+Right)/2;
if(A<=Middle) Query(Node*2,Left,Middle);
if(B>Middle) Query(Node*2+1,Middle+1,Right);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
{
scanf("%d",&X);
Poz=i; Val=X;
Update(1,1,N);
}
for(;M;M--)
{
scanf("%d",&W);
if(W)
{
scanf("%d%d",&Poz,&Val);
Update(1,1,N);
}
else
{
scanf("%d%d",&A,&B);
R=0; Query(1,1,N);
printf("%d\n",R);
}
}
return 0;
}